Как скрыть некоторые узлы в Richfaces Tree (не отображать узлы по условию)? - PullRequest
0 голосов
/ 28 мая 2010

В моем приложении SEAM есть дерево категорий и курсов. Курсы могут быть активными и неактивными. Я хочу, чтобы в моем дереве отображались только активные или все курсы.

Я решил всегда строить полное дерево в своем компоненте области PAGE, так как создание этого дерева - довольно дорогая операция. У меня есть логический флаг courseActive в данных, обернутых TreeNode . Теперь я не могу найти способ показать узел курсов, только если этот флаг имеет значение 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), а затем иметь возможность показывать только каталоги на одной странице и только каталоги, а не скрытые файлы по умолчанию на другой странице. с возможностью показа всех файлов и каталогов с помощью флажка на этой странице.

Недостаточно хедировать (/ не отображать) элемент rish: treeNode в facelet, поскольку, если есть узел, который не упоминается ни в одном из визуализированных rich: treeNode, этот узел отображается с использованием значков и заголовка по умолчанию. Можно подумать о rich: treeNode, как об элементе, добавляет только пользовательский визуальный стиль к узлам некоторых типов, но не как элемент, отвечающий за рендеринг узла.

Ответы [ 3 ]

0 голосов
/ 31 мая 2010

Вы пробовали <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>

Обновление

Я не уверен, что на самом деле твой вопрос, но я предполагаю, что ты хочешь скрыть триод В вашем примере это будет выглядеть так:

<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>
0 голосов
/ 31 мая 2010

Похоже, есть два способа решения моей проблемы.

Первый: Я могу использовать rich: recursiveTreeNodesAdaptor и в своей функции рекурсивного геттера я могу пропустить некоторые узлы. Этот подход может быть трудно использовать с перетаскиванием для перемещения элементов в дереве.

Второй: Присоединить отсоединить некоторые узлы на стороне сервера. Недостатком этого подхода является большое количество Java-кода для рекурсивных итераций по дереву.

Я думаю, что я буду использовать второй способ, так как мне нужен редактор перетаскивания дерева.

Этот же вопрос обсуждался на форуме сообщества JBoss год назад: http://community.jboss.org/message/64929 и второй способ тоже посоветовали

0 голосов
/ 30 мая 2010

Я действительно не уверен, но, возможно, вы могли бы попробовать использовать Facelets. Будет ли вычисляться EL правильно, поскольку c: if является тегом времени сборки?

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

...