簡體   English   中英

如何隱藏Richfaces樹中的某些節點(不按條件渲染節點)?

[英]How to hide some nodes in Richfaces Tree (do not render nodes by condition)?

我的SEAM應用程序中有類別和課程的樹。 課程可能是活躍的也可能是非活躍的。 我希望能夠僅顯示樹中的當前課程或所有課程。

我決定始終在PAGE范圍組件中構建完整的樹,因為構建此樹是相當昂貴的操作。 我在TreeNode <T>包裝的數據中具有布爾標志courseActive。 現在,僅當此標志為true時,我才能找到顯示課程節點的方法。

我用以下代碼實現了最好的結果:

<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(/未渲染)rish:treeNode元素,因為如果存在任何渲染的rich:treeNode中未提及的節點,則使用默認圖標和標題來渲染該節點。 可能會想到rich:treeNode就像一個元素一樣,只是將自定義視覺樣式添加到某些類型的節點上,而不是作為負責渲染節點的元素。

我確實不確定,但是也許您可以嘗試使用Facelets。 由於c:if是構建時標簽,EL是否將被正確評估?

請參閱: http//wiki.java.net/bin/view/Projects/FaceletsFAQ#Why_doesn_t_my_c_if_ui_repeat_ui

您是否嘗試過<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>

看來有兩種方法可以解決我的問題。

第一個:我可以使用rich:recursiveTreeNodesAdaptor,在我的遞歸getter函數中,我可以跳過一些節點。 通過拖放來移動樹中的項目可能很難使用此方法。

第二個: Attach分離服務器端的一些節點。 這種方法的缺點是很多Java代碼用於樹的遞歸迭代。

我想我將使用第二種方法,因為我需要拖放樹編輯器。

一年前,在JBoss社區論壇中討論了相同的問題: http//community.jboss.org/message/64929,並且還建議了第二種方法

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM