我将 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”引用的数据的当前树节点感兴趣,而不是用户当前选择的节点。