3

我试图在 JSF 中显示一棵树,而不用硬编码我想要显示的树的深度。也许对于一种配置,我只想显示叶子,也许对于另一种配置,我想显示按节点上一层的节点分组的叶子,等等。因此,对于一种配置,它可能是:

  • 问题 1
  • 问题2
  • 问题 3
  • 问题 4

而对于另一种配置,相同的底层数据结构可能会产生:

  • 第一类:
    • 问题 1
    • 问题2

  • 第 2 类:
    • 问题 3

  • 第三类:
    • 问题 4

假设第三个配置按超类别对类别进行分组,等等。

如果节点有更多的孩子,我尝试制作一个递归调用自身的复合组件。我这样做是通过<ui:fragment rendered="#{node.hasChildren}">- 惊喜!-- 这导致了无限循环和堆栈溢出。

该项目已经安装了 PrimeFaces,所以我正在查看 PrimeFacesTreeTreeNode. 但这感觉不太对。我不希望树节点在用户界面中可扩展。我希望一切都得到充分扩展。我还没有深入这个兔子洞,所以我怀疑可能有一种方法可以实现这一点Tree,但感觉就像我违背了它的构建目的。

有什么好的方法解决这个问题?


编辑: 我正在尝试使用 <tree> 和 <treeNode>,但它不起作用。我的代码如下所示:

<p:tree value="#{cc.attrs.classification}" var="child">
    <p:treeNode>
        <ui:fragment rendered="#{child.childCount > 0}">
            [do node stuff]
        </ui:fragment>
        <ui:fragment rendered="#{child.childCount == 0}">
            [do leaf stuff]
        </ui:fragment>
    </p:treeNode>
</p:tree>

...在哪里classification实现TreeNode接口。这会导致控制台出现错误,抱怨child属于 String 类型,因此无法执行我要求的任何有趣的事情。我究竟做错了什么?

4

2 回答 2

4

如果节点有更多的孩子,我尝试制作一个递归调用自身的复合组件。我这样做是通过 - 惊喜!-- 这导致了无限循环和堆栈溢出。

它失败了,因为rendered在构建 JSF 组件树期间没有评估属性,而只是在生成 HTML 输出期间。您基本上需要 JSTL<c:if>而不是<some:component rendered>. 它在构建 JSF 组件树期间运行,因此您最终不会无限地包含组合本身。


该项目已经安装了 PrimeFaces,所以我正在查看 PrimeFaces Tree 和 TreeNode。但这感觉不太对。我不希望树节点在用户界面中可扩展。我希望一切都得到充分扩展。

JSF 实用程序库OmniFaces正是您正在寻找的组件,<o:tree>. 该组件本身不会生成任何 HTML 标记,因此您可以自由地以您想要的方式声明 HTML/JSF 标记,也可以针对特定的深度级别。

这是展示示例。请注意页面底部的链接,它们指向可能对学习练习有用/有趣的源代码。这并不像您在开发复合材料时最初所想的那样微不足道(毕竟这不是完成这项工作的正确工具)。

至于区分叶节点,<o:tree>提供了这种可能性如下:

<o:tree value="#{bean.tree}" var="item" varNode="node">
    <o:treeNode>
        <o:treeNodeItem>
            <ui:fragment rendered="#{not node.leaf}">
                ...
            </ui:fragment>
            <ui:fragment rendered="#{node.leaf}">
                ...
            </ui:fragment>
            <o:treeInsertChildren />
        </o:treeNodeItem>
    </o:treeNode>
</o:tree>
于 2013-09-19T16:16:30.180 回答
3

好。由于您可以从 ManagedBean 管理树结构,因此您可以在 Java 中进行递归,然后只渲染树。

上周我已经做到了。在 prerenderview 期间,我使用递归方法初始化树,就像:

 <p:tree value="#{bean.tree}" var="node" selection="#{bean.property}" >   
   <p:treeNode>  
     <h:outputText value="#{node}" /> 
   </p:treeNode>
 </p:tree>

希望能帮助到你!

于 2013-09-19T14:41:41.953 回答