h: составной компонент dataTable, cc.attrs.var, IllegalArgumentException
Я пытаюсь создать свой собственный dataTable, такой как простой. Проблема в том, что cc.attrs.var
при использовании выдает исключение IllegalArgumentException. Поэтому мне интересно, как я могу иметь атрибут var, как Primefaces.
<cc:interface>
<cc:attribute name="value"/>
<cc:attribute name="var"/>
<cc:attribute name="styleClass"/>
</cc:interface>
<cc:implementation>
<div>Previous</div>
<div>Next</div>
<h:dataTable value="#{cc.attrs.value}" var="#{cc.attrs.var}" styleClass="#{cc.attrs.styleClass}">
<ui:insert/>
</h:dataTable>
</cc:implementation>
1 ответ
В соответствии с UIData#setValueExpression()
Javadoc, не допускается иметь выражение EL в var
приписывать.
Броски: IllegalArgumentException - если имя является одним из
id
,parent
,var
, или жеrowIndex
Лучше всего создать вспомогательный компонент, в котором вы будете вручную оценивать и устанавливать var
атрибут UIData
компонент связан с <h:dataTable>
в течение postAddToView
событие.
<cc:interface componentType="yourTableComposite">
<cc:attribute name="value" />
<cc:attribute name="var" />
</cc:interface>
<cc:implementation>
<f:event type="postAddToView" listener="#{cc.init}" />
<h:dataTable binding="#{cc.table}" value="#{cc.attrs.value}">
<cc:insertChildren />
</h:dataTable>
</cc:implementation>
@FacesComponent("yourTableComposite")
public class YourTableComposite extends UINamingContainer {
private UIData table;
public void init() {
table.setVar((String) getAttributes().get("var"));
}
public UIData getTable() {
return table;
}
public void setTable(UIData table) {
this.table = table;
}
}
Обратите внимание, что я исправил <ui:insert>
быть <cc:insertChildren>
, <ui:insert>
может использоваться только в <ui:composition>
/ <ui:decorate>
,