使用o:tree和p:panelGrid进行虚假表示

时间:2014-07-01 14:46:10

标签: jsf-2 primefaces omnifaces

我想构建一个以p:oanelGrid为节点的树。像这样:

<o:tree value="#{plannedElementsBean.tree}" var="item">
    <o:treeNode level="0">
        <o:treeNodeItem>
            <p:panelGrid columns="6">
                <f:facet name="header">
                    <h:outputText value="Header" />
                </f:facet>

                <o:treeInsertChildren />

                <p:panel><h:outputText value="Inner" /></p:panel>

                <f:facet name="footer">
                    <h:outputText value="Footer" />
                </f:facet>
            </p:panelGrid>                            
        </o:treeNodeItem>
    </o:treeNode>
</o:tree>

问题是,孩子之间的垂直线丢失了。 p:panelGrid在其子项之间呈现垂直线。我用静态标记测试了它。但是o:tree插入的所有子项被视为第一个子项所在的位置,因此呈现为第一个部分,而内部面板呈现为第二个部分,除以垂直线。我希望所有插入的孩子和内部面板被垂直线分开。这里出了什么问题?

1 个答案:

答案 0 :(得分:2)

这确实是预期的行为。 <o:tree>和朋友是像<ui:repeat>这样的UI组件,而不是像<c:forEach>这样的标记处理程序。 <p:panelGrid>为每个UI组件子级呈现<td>

您似乎认为<o:tree>(和等效<ui:repeat>)递归生成多个JSF组件,最终取代<o:treeInsertChildren>。这不是真的。在组件树中实际上只有一个JSF组件,它根据当前的迭代状态重复生成其HTML输出。实际上只有一个<o:treeInsertChildren>组件,其所有HTML输出最终都在<td> <p:panelGrid>个{{1}}。

您最好的选择是使用固定宽度为16%的左浮动div,以便在每6个项目后突破到下一行。请注意,如有必要,您可以轻松地在纯HTML元素上重用PrimeFaces标准CSS类。

另见: