【问题标题】:How to hide some nodes in Richfaces Tree (do not render nodes by condition)?如何隐藏 Richfaces Tree 中的一些节点(不按条件渲染节点)?
【发布时间】:2011-02-25 05:59:49
【问题描述】:

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

我决定总是在我的 PAGE 范围组件中构建完整的树,因为构建此树是一项非常昂贵的操作。我在 TreeNode 包装的数据中有布尔标志 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),然后能够在一个页面上仅显示目录,并且默认情况下仅在另一页面上显示目录而不是隐藏文件可以使用此页面上的复选框显示所有文件和目录。

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

【问题讨论】:

    标签: java jsf seam richfaces facelets


    【解决方案1】:

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

    见:http://wiki.java.net/bin/view/Projects/FaceletsFAQ#Why_doesn_t_my_c_if_ui_repeat_ui

    【讨论】:

    • 它不起作用,原因很清楚。如果有一个节点,它就是树模型,即使它没有rich:treeNode 元素,它也会在由rich:tree 生成的视图中呈现。 c:if 的结果与我发布的代码获得的结果完全相同。我正在寻找如何避免渲染一些我不需要的节点的方法。实际上我想在三个或四个不同的视图上使用相同的支持 bean 模型,并且在每个视图中都会有不同的条件来渲染哪些节点以及跳过哪些节点。
    【解决方案2】:

    你试过&lt;s:fragment&gt;吗?

    <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>
    

    更新

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

    <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>
    

    【讨论】:

    • 它将无法按预期工作,因为您的代码将隐藏 treeNode 元素,而该元素并未真正在视图上呈现节点。它只允许为某些类型的节点指定自定义样式参数。如果模型中有节点并且没有为其渲染treeNode元素,则该节点将使用默认样式渲染。
    【解决方案3】:

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

    第一个: 我可以使用rich:recursiveTreeNodesAdaptor 并且在我的递归getter 函数中我可以跳过一些节点。这种方法可能很难通过拖放来移动树中的项目。

    第二个: Attach detach一些服务器端的节点。这种方法的缺点是大量的 Java 代码用于通过树进行递归迭代。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-02-18
      • 1970-01-01
      • 2012-01-23
      • 2014-11-03
      • 2013-10-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多