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>,

Смотрите также:

Другие вопросы по тегам