如何在Richfaces树中隐藏一些节点(不按条件渲染节点)?

时间:2010-05-28 17:34:33

标签: java jsf seam richfaces facelets

我的SEAM应用程序中有一个类别和课程树。课程可能是活动的和非活动的。我希望能够在我的树中仅显示活动或所有课程。

我决定始终在我的PAGE范围组件中构建完整的树,因为构建此树是非常昂贵的操作。我在TreeNode< T>包装的数据中有boolean flag courseActive。现在,只有当这个标志为真时我才能找到显示课程节点的方法。

使用以下代码获得的最佳结果:

<h:outputLabel for="showInactiveCheckbox" value="show all courses: "/>
<h:selectBooleanCheckbox id="showInactiveCheckbox" value="#{categoryTreeEditorModel.showAllCoursesInTree}">
   <a4j:support event="onchange" reRender="categoryTree"/>
</h:selectBooleanCheckbox>

<rich:tree id="categoryTree" value="#{categoryTree}" var="item" switchType="ajax"
           ajaxSubmitSelection="true" reRender="categoryTree,controls"
           adviseNodeOpened="#{categoryTreeActions.adviseRootOpened}"
           nodeSelectListener="#{categoryTreeActions.processSelection}"
           nodeFace="#{item.typeName}">

   <rich:treeNode type="Category" icon="..." iconLeaf="...">
      <h:outputText value="#{item.title}"/>
   </rich:treeNode>

   <rich:treeNode type="Course" icon="..." iconLeaf="..."
                  rendered="#{item.courseActive or categoryTreeEditorModel.showAllCoursesInTree}">
      <h:outputText rendered="#{item.courseActive}" value="#{item.title}"/>
      <h:outputText rendered="#{not item.courseActive}" value="#{item.title}" style="color:#{a4jSkin.inactiveTextColor}"/>
   </rich:treeNode>

</rich:tree>

唯一的问题是,如果某个节点未在任何rich:treeNode中列出,它仍然显示为由Object.toString()方法获取的标题,并且被隐藏。

有人知道如何根据某些条件在Richfases树中显示一些节点吗?

更新

为了更好地理解我正在尝试做的事情,我可以提供一个简单的例子:

假设我有一个包含文件和目录的文件系统,并且有正常和隐藏文件(在我的情况下,我没有隐藏目录,但这并不重要)。

我想一次读取文件和目录并将树存储在模型中(org.richfaces.model.TreeNode),然后能够在一个页面上只显示目录,而在另一个页面上只显示目录而不是隐藏文件可以使用此页面上的复选框显示所有文件和目录。

没有足够的hede(/ not render)rish:facelet中的treeNode元素,因为如果有一个节点在任何渲染的rich中都没有提到:treeNode这个节点使用默认的图标和标题来呈现。人们可能会想到rich:treeNode就像一个elemnt,只是将自定义视觉样式添加到某些类型的节点,而不是作为负责渲染节点的元素。

3 个答案:

答案 0 :(得分:0)

我真的不确定,但也许你可以尝试使用Facelets。是否会正确评估EL,因为c:if是构建时标记吗?

请参阅:http://wiki.java.net/bin/view/Projects/FaceletsFAQ#Why_doesn_t_my_c_if_ui_repeat_ui

答案 1 :(得分:0)

您是否尝试过<s:fragment>

<s:fragment rendered="#{item.flag == 'true'}">
    Show some stuff here when flag returns true
</s:fragment>

<s:fragment rendered="#{not item.flag}">
    Show some stuff here when flag is NOT true
</s:fragment>

<强>更新

我不确定你的问题到底是什么,但我猜你想隐藏一个treenode 在您的示例中,它看起来像这样:

<s:fragment rendered="#{item.courseActive}">
   <rich:treeNode type="Category" icon="..." iconLeaf="...">
      <h:outputText value="#{item.title}"/>
   </rich:treeNode>
</s:fragment>

<s:fragment rendered="#{not item.courseActive}">
  <rich:treeNode type="Course" icon="..." iconLeaf="...">
     <h:outputText value="#{item.title}"/>
  </rich:treeNode>
</s:fragment>

答案 2 :(得分:0)

看起来有两种方法可以解决我的问题。

第一个:我可以使用rich:recursiveTreeNodesAdaptor,在我的递归getter函数中,我可以跳过一些节点。对于在树中移动项目,拖放可能很难使用。

第二个:附加分离服务器端的一些节点。这种方法的缺点是很多Java代码用于通过树的递归迭代。

我想我会使用第二种方式,因为我需要拖放树编辑器。

一年前JBoss社区论坛讨论了同样的问题:http://community.jboss.org/message/64929 第二种方式也被建议