如何在不连接托管bean中的UI组件的情况下访问primefaces树中的当前TreeNode(以标记或编程方式)?

use*_*501 7 jsf primefaces jsf-2

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

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

复合滤波器示例:

((location ='cal')AND(描述包含'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>
Run Code Online (Sandbox Code Playgroud)

虽然元素上的"value"属性接受根TreeNode(从托管bean中检索),但"var"属性指向当前树节点中存在的实际数据,而不是节点本身.我想要一种方法来标记或以编程方式访问当前树节点,而不是其包装数据.

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

我知道你可以使用一个解析为底层DataModel而不是数据集合的表达式作为h:dataTable的"值",但我相信你只能将根节点本身与p:tree一起使用.

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

在没有更好的替代方案的情况下,我尝试使用"binding"属性将p:tree元素直接绑定到托管bean中的Tree实例(Tree是p:tree的UIComponent类),这允许我访问通过getTreeNode()方法的当前节点,但考虑到托管bean和视图组件之间的生命周期不匹配,我宁愿避免这种情况.它不能完美地工作,我认为必须有一个更好,更简单的解决方案.

我也尝试使用jsf数据表 - 使用嵌套数据表来处理复合部分 - 但是考虑到在jsf标记中创建有条件递归结构的困难而决定它(我相信在视图构建时不评估"呈现"属性)所以很难避免无限递归).

为了澄清,我只对包含"var"引用的数据的当前树节点感兴趣,而不是用户当前选择的节点.

Cer*_*nus 6

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


小智 0

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

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

选择=“#{myManagedBean.selectedNode}”

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