2010-11-25 29 views
3

S'il vous plaît envisager de suivre par exemple l'arbre des visages riche:Rich face à problème de l'arbre

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

C'est l'arbre échantillon pour représenter "Bureaux -> Employés" structure de données. Je veux que les employés soient chargés de manière paresseuse - j'ai donc introduit l'écouteur d'expansion loadEmplyeesIfNeeded. Tout fonctionne bien sauf une chose. Les employés sont chargés après le nœud de bureau est étendu .. Ainsi, lorsque l'arbre est rendu tous les bureaux n'ont pas employé et sont rendus comme .. Et leafs leafs cours ne peut pas être étendu ....

Pour faire un long magasin court. Est-il possible de définir que le nœud doit être rendu en tant que nœud (avec possibilité de développer), même s'il n'a pas d'enfants? Le meilleur serait si riche: treeNode aurait un attribut comme isNode mais ce n'est pas le cas.

b.t. Je pourrais le résoudre en ajoutant simplement à chaque bureau d'un employé faux lors de l'initialisation des bureaux .. Mais ce n'est pas très beau travail autour ...

Merci à l'avance de l'aide.

Répondre

2

Vous pouvez le faire en utilisant OpenFaces TreeTable si vous ne me dérange pas d'ajouter une autre bibliothèque à votre application. Lazy loading peut être mis en œuvre en ajoutant simplement l'preloadedNodes = « none » (ou prelodedNodes = « levelsPreloaded: 1 ») à <o:treeTable> étiquette, et il détecte également automatiquement si doit être affiché Basculement d'extension du nœud. OpenFaces TreeTable est assez personnalisable et il ne devrait pas nécessairement ressembler à une table multi-colonne, mais il peut aussi être affiché comme un arbre simple (par exemple voir this page)

Voici comment un tel TreeTable peut être déclaré (vous pourriez en fait besoin de plus de personnalisations, mais cet exemple montre l'idée):

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

la méthode treeTableBean.nodeChildren doit prendre la valeur de la variable « noeud », et le retour de ses nœuds enfants (ou retour nœuds racines si sa valeur est nul). Voici comment cette méthode pourrait ressembler à votre cas:

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

Un peu en retard mais. Qui sait.

Vous pouvez étendre org.richfaces.model.TreeNodeImpl comme je l'ai fait.

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(); 
     } 
    } 
+0

ce travail de musc. – caarlos0

+0

Comment puis-je remplacer l'implémentation d'origine? –