使用复合组件将列添加到Primefaces PanelGrid

时间:2014-10-03 01:41:56

标签: jsf primefaces composite-component 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>

但是当我这样做时...... Facets不会被添加。我认为这可能与无法使用<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>

这假设我将复合材料修改为:

{{1}}

任何人都可以提供任何替代方案或建议如何使用模式吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

我会发布我的解决方法,这在技术上并不是一个解决方案 - 所以我认为将其标记为非常公平。

这不是一个真正解决方案的原因是因为它实际上并没有使用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>