我正在尝试像primefaces一样创建自己的dataTable。问题是cc.attrs.var
在使用时会抛出IllegalArgumentException。所以我想知道怎样才能拥有像Primefaces这样的var属性。
<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>
答案 0 :(得分:3)
根据UIData#setValueExpression()
javadoc,不允许在var
属性中使用EL表达式。
抛出: IllegalArgumentException - 如果name是
之一id
,parent
,var
或rowIndex
您最好的选择是创建一个支持组件,在var
事件期间,您可以手动评估并设置UIData
组件的<h:dataTable>
属性绑定到postAddToView
。< / p>
<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>
中使用。