Добавление столбцов в сетку Primefaces PanelGrid с помощью составного компонента

Я новичок в JSF и Primefaces, и я хотел бы создать составной компонент, содержащий Primefaces GridPanel:

<composite:interface>
    <composite:attribute name="bind" type="com.whatever.IBackingBean"/>
    <composite:facet name="headerCols"/>
    <composite:facet name="bodyCols"/>
</composite:interface>
<composite:implementation>
<h:form>
    <p:panelGrid>
        <p:row>
            <composite:renderFacet name="headerCols"/>
            <p:column>
                <h:outputText value="Col1" />
            </p:column>
            <p:column>
                <h:outputText value="Col2" />
            </p:column>
            <p:column>
                <h:outputText value="Col3" />
            </p:column>
        </p:row>

        <p:row>
            <composite:renderFacet name="bodyCols"/>
            <p:column>
                <h:outputText value="#{cc.attrs.bind.prop1}" />
            </p:column>
            <p:column>
                <h:outputText value="#{cc.attrs.bind.prop2}" />
            </p:column>
            <p:column>
                <h:outputText value="#{cc.attrs.bind.prop3}" />
            </p:column>
        </p:row>
    </p:panelGrid>
</h:form>
</composite:implementation>

И хотел бы использовать что-то вроде:

<x:mycomposite bind="#{myBackingBean}">
    <f:facet name="headerCols">
        <p:column>
             <h:outputText value="My Extra Prop"/>
        </p:column>
    </f:facet>
    <f:facet name="bodyCols">
        <p:column>
             <h:outputText value="#{myBackingBean.extraProp}"/>
        </p:column>
    </f:facet>
</x:mycomposite>

Но когда я это делаю ... Аспекты не добавляются. Я думаю, что это, возможно, как-то связано с невозможностью использовать <composite:renderFacet> в качестве параметра для <p:panelGrid>, который также (предположительно) является составным.

Поскольку мне нужно добавлять столбцы, а не строки, мне нужно добавлять в нескольких местах, поэтому <composite:insertChildren> не работает.

Предположительно, я мог бы просто использовать атрибут, но как передать значение элемента в качестве значения атрибута? Поскольку что-то вроде этого, похоже, недоступно:

<x:mycomposite bind="#{myBackingBean}">
    <f:attribute name="headerCols">
        <p:column>
             <h:outputText value="My Extra Prop"/>
        </p:column>
    </f:attribute>
    <f:attribute name="bodyCols">
        <p:column>
             <h:outputText value="#{myBackingBean.extraProp}"/>
        </p:column>
    </f:attribute>
</x:mycomposite>

Предполагая, что я изменил композицию на:

<composite:interface>
    <composite:attribute name="bind" type="com.whatever.IBackingBean"/>
    <composite:attribute name="headerCols"/>
    <composite:attribute name="bodyCols"/>
</composite:interface>
<composite:implementation>
<h:form>
    <p:panelGrid>
        <p:row>
            #{cc.attrs.headerCols}
            <p:column>
                <h:outputText value="Col1" />
            </p:column>
            <p:column>
                <h:outputText value="Col2" />
            </p:column>
            <p:column>
                <h:outputText value="Col3" />
            </p:column>
        </p:row>

        <p:row>
            #{cc.attrs.bodyCols}
            <p:column>
                <h:outputText value="#{cc.attrs.bind.prop1}" />
            </p:column>
            <p:column>
                <h:outputText value="#{cc.attrs.bind.prop2}" />
            </p:column>
            <p:column>
                <h:outputText value="#{cc.attrs.bind.prop3}" />
            </p:column>
        </p:row>
    </p:panelGrid>
</h:form>
</composite:implementation>

Может ли кто-нибудь предоставить альтернативу или посоветовать, как заставить работать шаблон использования?

Спасибо!


person Jim    schedule 03.10.2014    source источник


Ответы (1)


Я опубликую свой обходной путь, который технически не является решением, поэтому я не думаю, что справедливо отмечать его как таковое.

Причина, по которой это на самом деле не решение, заключается в том, что он фактически не использует Primefaces <p:panelGrid> (чьи варианты макета я постепенно начинаю ненавидеть в целом - но это другая тема), а вместо этого просто использует HTML5 <table>. Он достигает общей цели, которую я хотел, но потребует от меня убедиться, что я вручную добавляю все правильные стили Primefaces в виджет таблицы, чтобы внешний вид оставался согласованным.

Если у кого-то есть альтернативное решение, я бы с удовольствием его увидел.

<composite:interface>
    <composite:attribute name="bind" type="com.whatever.IBackingBean"/>
    <composite:facet name="headerCols"/>
    <composite:facet name="bodyCols"/>
</composite:interface>
<composite:implementation>
<h:form>
<table>
    <tr>
        <composite:renderFacet name="headerCols"/>
        <th>
            <h:outputText value="Col1" />
        </th>
        <th>
            <h:outputText value="Col2" />
        </th>
        <th>
            <h:outputText value="Col3" />
        </th>
    </tr>

    <tr>
        <composite:renderFacet name="bodyCols"/>
        <td>
            <h:outputText value="#{cc.attrs.bind.prop1}" />
        </td>
        <td>
            <h:outputText value="#{cc.attrs.bind.prop2}" />
        </td>
        <td>
            <h:outputText value="#{cc.attrs.bind.prop3}" />
        </td>
    </tr>
</table>
</h:form>
</composite:implementation>
person Jim    schedule 03.10.2014