【问题标题】:Rich faces tree problem富人面临树问题
【发布时间】:2011-05-15 15:56:42
【问题描述】:

请考虑以下富人脸树示例:

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

这是表示“办公室 --> 员工”数据结构的示例树。 我想以惰性方式加载员工 - 所以我引入了 loadEmplyeesIfNeeded 扩展侦听器。 除了一件事,一切都很好。员工是在办公室节点展开后加载的。所以当树被渲染时,所有办公室都没有任何员工,并被渲染为叶子。当然叶子不能展开......

使长存储短。尽管没有孩子,有什么方法可以设置节点应该呈现为节点(有可能扩展)? 最好是如果 rich:treeNode 有一些属性,比如 isNode 但它没有..

顺便说一句。我可以通过在办公室初始化时向每个办公室添加一个假员工来解决它。但这不是很好的解决方法......

提前感谢您的帮助。

【问题讨论】:

    标签: java jsf richfaces


    【解决方案1】:

    有点晚了,但是。谁知道呢。

    您可以像我一样扩展 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】:

    如果您不介意向您的应用程序添加另一个库,您可以使用OpenFaces TreeTable 来完成此操作。懒加载可以通过在&lt;o:treeTable&gt;标签上添加preloadedNodes="none"(或prelodedNodes="levelsPreloaded:1")来实现,它还会自动检测是否应该显示节点的展开切换。 OpenFaces TreeTable 是非常可定制的,它不一定看起来像一个多列表,但它也可以显示为一个简单的树(例如,参见this page

    下面是如何声明这样一个 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”变量的值,并返回其子节点(如果其值为 null,则返回根节点)。以下是此方法在您的情况下的外观:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-29
      • 1970-01-01
      • 2020-07-09
      • 2020-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-14
      相关资源
      最近更新 更多