h:dataTable复合组件,cc.attrs.var,IllegalArgumentException

时间:2016-04-11 17:59:04

标签: jsf datatable composite-component

我正在尝试像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>

1 个答案:

答案 0 :(得分:3)

根据UIData#setValueExpression() javadoc,不允许在var属性中使用EL表达式。

  

抛出:   IllegalArgumentException - 如果name是idparentvarrowIndex

之一

您最好的选择是创建一个支持组件,在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>中使用。

另见: