【发布时间】:2011-02-25 05:59:49
【问题描述】:
我的 SEAM 应用程序中有一个类别和课程树。课程可以是活跃的和不活跃的。我希望能够在我的树中仅显示活动或所有课程。
我决定总是在我的 PAGE 范围组件中构建完整的树,因为构建此树是一项非常昂贵的操作。我在 TreeNode
我使用以下代码取得的最佳结果:
<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