gpt4 book ai didi

jsf - 在 JSF 中伪造递归

转载 作者:行者123 更新时间:2023-12-04 21:21:23 24 4
gpt4 key购买 nike

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

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

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

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

  • 第 2 类:
    • 问题 3

  • 第 3 类:
    • 问题 4

假设第三种配置按父类(super class)别等对类别进行分组。

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

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

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


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

<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 类型,因此不能做我要求的任何有趣的事情。我做错了什么?

最佳答案

I tried making a composite component that called itself recursively if the node had more children. I did this via and -- surprise! -- this resulted in an infinite loop and a stack overflow.

失败是因为rendered在构建 JSF 组件树期间不评估属性,而仅在生成 HTML 输出期间评估。你基本上需要 JSTL <c:if>而不是 <some:component rendered> . It runs during building the JSF component tree ,因此您最终不会无限地包含复合 Material 本身。


The project already has PrimeFaces installed, so I'm looking at PrimeFaces Tree and TreeNode. But that doesn't quite feel right; I don't want the tree nodes to be expandable in the user interface. I want everything to be fully expanded.

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

Here's the showcase example .请注意页面底部的链接,它们指向的源代码可能对学习练习有帮助/有趣。这并不像您最初在开发复合 Material 时所想的那样微不足道(毕竟不完全是 the right tool for the job )。

至于区分叶节点,<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>

关于jsf - 在 JSF 中伪造递归,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18897476/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com