2010-02-16 20 views
9

Je voudrais savoir comment puis-je vérifier les nœuds frères d'un arbre en cliquant sur un nœud particulier dans ExtJs.vérifier les nœuds enfants d'un arbre quand un parent est cliqué [ExtJS]

J'ai donné des identifiants pour chaque nœud et je peux accéder à l'identifiant d'un nœud cliqué. alors comment puis-je procéder à la vérification des nœuds enfants automatiquement?

quelqu'un s'il vous plaît aidez-moi ..

Répondre

7
// or any other way of getting hands on the node you want to work with 
var node = treePanel.getNodeById('your-id'); 
node.eachChild(function(n) { 
    n.getUI().toggleCheck(true); 
}); 

Si vous voulez que cela fonctionne sur le sous-arbre ensemble du noeud courant, vous devrez faire quelques récursivité.

Un peu plus intégré:

treePanel.on('checkchange', function(node, checked) { 
    node.eachChild(function(n) { 
     n.getUI().toggleCheck(checked); 
    }); 
}); 
+2

ne fonctionne pas dans les versions plus récentes de l'API. a réussi cela http://stackoverflow.com/questions/6579769/automatically-check-uncheck-all-subtree-nodes-in-extjs-tree-when-certain-node-ge – pahan

+0

C'est correct. Le code ci-dessus est pour Ext JS 3, Ext JS 4 a beaucoup changé l'API de l'arbre. –

+2

Donc, si vous ne développez pas les nœuds enfants, ils ne seront pas chargés. Ainsi, lorsque vous appelez checkchange, il ne vérifie que les nœuds enfants qui ont été chargés. Ce que j'ai fini par faire était d'ajouter node.expand (true); Avant node.eachChild, il étend tous les nœuds et les vérifie tous. – Grammin

0

Le JSON ou XML auront besoin de la « checked » la propriété est définie sur true ou false lorsque vous remplissez les nœuds. Je suppose que vous utilisez un AsyncTreeNode pour le faire pour vous. Si les noeuds d'arbre sont créés sans cette propriété vérifiée, ExtJS ne le rendra pas avec la case à cocher.

5
function nodeCheck(node) { 
    node.eachChild(function(n) { 
     if(n.hasChildNodes()) 
      nodeCheck(n) 
     n.getUI().toggleCheck(false); 
    }); 
} 
var node = (tree.getSelectionModel().getSelectedNode()) ? tree.getSelectionModel().getSelectedNode() : tree.root; 
if(node) nodeCheck(node); 

Il fonctionne bien pour moi;)

+0

Fonctionne bien! Au moins dans Chrome, je n'ai pas l'erreur suivante: "Taille maximale de la pile d'appels dépassée" =) –

2

auditeurs: {

checkchange : function(node, checked) { 
    node.parentNode.cascadeBy(function(n){n.set('checked', checked);}); 
} 

}

1
function checkChange(node, checked, Object) { 
    node.cascadeBy(function(n) { 
     n.set('checked', checked); 
    }); 
} 
+0

Une brève explication aurait été utile. –

-1

Ou, si comme moi, vous devez vérifier automatiquement/décocher la nœud parent lorsque tous les nœuds feuille enfants sont cochés/décochés, vous pouvez essayer ceci:

function (node, checked) 
{ 

    if (node.get('leaf')) 
    { 
     node = node.parentNode; 
     var siblingStateEqual = true; 
     node.cascadeBy(function (n) 
     { 
      if (n != node) { 
       if (n.get('checked') != checked) { 
        siblingStateEqual = false; 
       } 
      } 

     }); 

     if (siblingStateEqual == checked) 
     { 
      node.set('checked', checked); 
     } 

    } 
    else 
    { 
     node.cascadeBy(function (n) { n.set('checked', checked); }); 
    } 


} 
0

La réponse de Mr C fonctionne bien (ExtJS 4.2), mais un bug se produira lorsque les childnodes de parentnode auront 1 enfant. Voici ma petite amélioration. Quelqu'un peut améliorer encore

function (node, checked) { 

    if (node.isLeaf()) { 
     node = node.parentNode; 
     var siblingStateEqual = true; 
     if (node.childNodes.length == 1) { 
      siblingStateEqual = checked; 
     } else { 
      node.cascadeBy(function (n) { 
       if (n != node) { 
        if (n.get('checked') != checked) { 
         siblingStateEqual = false; 
        } 
       } 

      }); 
     } 

     if (siblingStateEqual == checked) { 
      node.set('checked', checked); 
     } 

    } 
    else { 
     node.cascadeBy(function (n) { 
      n.set('checked', checked); 
     }); 
    } 
}