Богатое дерево сталкивается с проблемой - PullRequest
3 голосов
/ 25 ноября 2010

Пожалуйста, рассмотрите следующий пример дерева с гранями:

  <rich:tree switchType="ajax">
<rich:treeNodesAdaptor id="officeNodeAdaptor" nodes="#{officesBean.offices}" var="office" >
      <rich:treeNode changeExpandListener="#{office.loadEmplyeesIfNeeded}" >
          <h:outputText value="#{office.name}" />
      </rich:treeNode>
<rich:treeNodesAdaptor id="employeeNodeAdaptor" nodes="#{office.employees}" var="employee">
       <rich:treeNode>
           <h:outputText value="#{employee.name}" />
       </rich:treeNode>
</rich:treeNodesAdaptor>

Это образец дерева для представления структуры данных «Офисы -> Сотрудники». Я хочу, чтобы emplyees загружались ленивым способом - поэтому я представил слушателя расширения loadEmplyeesIfNeeded. Все работает хорошо, кроме одной вещи. Работники загружаются после расширения офисного узла. Таким образом, при рендеринге дерева все офисы не имеют ни одного сотрудника и отображаются как листы .. И, конечно, листы не могут быть расширены ....

Чтобы сделать длинный магазин коротким. Есть ли способ установить, что узел должен отображаться как узел (с возможностью расширения), несмотря на отсутствие дочерних элементов? Лучше всего было бы, если бы rich: treeNode имел бы какой-нибудь атрибут, например isNode, но это не так.

b.t.w. Я мог бы решить эту проблему, просто добавив в каждый офис фальшивого сотрудника при инициализации офисов ... Но это не очень хорошая работа вокруг ...

Заранее спасибо за помощь.

Ответы [ 2 ]

4 голосов
/ 15 февраля 2011

Немного поздно, но.Кто знает.

Вы можете расширить org.richfaces.model.TreeNodeImpl, как я сделал.

   public class RichTreeNodeImpl extends org.richfaces.model.TreeNodeImpl {

       private boolean treatAsNode;

       public boolean getTreatAsNode() {
         return treatAsNode;
       }

       public void setTreatAsNode(boolean treatAsNode) {
         this.treatAsNode = treatAsNode;
       }

       @Override
       public boolean isLeaf() {
           if (this.treatAsNode)
              return false;
           else
              return super.isLeaf();
       }
   }
2 голосов
/ 26 ноября 2010

Вы можете сделать это, используя OpenFaces TreeTable , если вы не против добавить другую библиотеку в свое приложение.Ленивую загрузку можно реализовать, просто добавив preloadedNodes = "none" (или prelodedNodes = "levelsPreloaded: 1") в тег <o:treeTable>, и он также автоматически определит, должен ли отображаться переключатель расширения узла.OpenFaces TreeTable вполне настраиваемый, и он не обязательно должен выглядеть как таблица из нескольких столбцов, но он также может отображаться в виде простого дерева (например, см. эта страница )

Вот кактакой TreeTable может быть объявлен (вам может потребоваться больше настроек, но этот пример демонстрирует идею):

<o:treeTable var="node" preloadedNodes="none">
  <o:dynamicTreStructure nodeChildren="#{treeTableBean.nodeChildren}"/>
  <o:treeColumn>
    <h:outputText value="node.name"/>
  </o:treeColumn>
</o:treeTable>

Метод treeTableBean.nodeChildren должен принять значение переменной "node" и вернуть еедочерние узлы (или возвращают корневые узлы, если его значение равно нулю).Вот как этот метод может выглядеть в вашем случае:

public List getNodeChildren() {
  Object node = Faces.var("node");
  if (node == null) 
    return getOffices();
  else
    return ((Office) node).getEmployees();
}
...