7

我将 Primefaces 3.4.1 与 Oracle 的 JSF 2.2 实现的 2.2.0-m05 里程碑版本一起使用。我还使用 Spring 3.1 进行依赖注入和一些 AOP。

我正在尝试使用 Primefaces 树组件来显示逻辑过滤规则的组合(并允许用户在组合结构内的任何深度创建组合/叶节点)。

示例复合过滤器:

((location = 'cal') AND (description contains 'test')) OR (project = 'someProject')

示例树标记:

<p:tree value="#{form.rootComponent}" var="filterComponent" animate="true">

    <p:treeNode type="composite">
       <!-- some composite specific components -->
    </p:treeNode>

    <p:treeNode type="leaf">
       <!-- some leaf specific components -->
    </p:treeNode>

</p:tree>

尽管元素上的“value”属性接受根 TreeNode(从托管 bean 中检索),但“var”属性指向当前树节点中存在的实际数据,而不是节点本身。我想要一种访问当前树节点的方法,而不是它的包装数据,无论是标记还是编程

如果我可以在标记中访问它,我可以将它作为方法参数传递给托管 bean。如果无法在标记中访问它,我可以通过模型对象获得直接的编程访问吗?(大概是通过访问底层树模型?)。

我知道您可以使用解析为基础 DataModel 的表达式而不是直接将数据集合作为 h:dataTable 的“值”,但我相信您只能将根节点本身与 p:tree 一起使用。

我可以在包装的数据对象中包含对树节点的引用,但如果可能的话,我真的宁愿避免讨厌的循环引用。

在没有更好的选择的情况下,我尝试使用“绑定”属性将 p:tree 元素直接绑定到托管 bean 中的 Tree 实例(Tree 是 p:tree 的 UIComponent 类),这样我就可以访问当前节点通过 getTreeNode() 方法,但考虑到托管 bean 和视图组件之间的生命周期不匹配,我更愿意避免这种情况。它不能按原样完美运行,我认为必须有一个更好、更简单的解决方案。

我还尝试使用 jsf 数据表 - 使用嵌套数据表来处理复合部分 - 但考虑到在 jsf 标记中创建条件递归结构的困难,我决定反对它(我相信在视图构建时不会评估“rendered”属性所以很难避免无限递归)。

澄清一下,我只对包含“var”引用的数据的当前树节点感兴趣,而不是用户当前选择的节点。

4

2 回答 2

6

PF Lead 刚刚在 PF 5.1.10 / 5.2 中为 p:treeTable 添加了一个名为“nodeVar”的新属性(不知道是否包含 p:tree)。此功能将允许获取实际的 TreeNode 而不是它的数据。因此,现在可以对节点本身执行额外的方法调用,例如 TreeNode.isLeaf()。

于 2015-02-04T20:12:53.513 回答
0

嗯,树组件中有一个名为“选择”的属性。您只需要提供对托管 bean 方法的引用。

例如,在您的 xhtml 中以下列方式定义属性:

selection="#{myManagedBean.selectedNode}"

通过上述属性的定义,您必须在托管 bean 中提供通常的 setter 和 getter 方法,这些方法引用 org.primefaces.model.TreeNode 实例。

于 2013-07-21T08:19:56.267 回答