2010-02-16 2 views

risposta

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); 
}); 

Se si desidera far funzionare tutto questo su tutta la sottostruttura del nodo corrente, dovrete fare un po 'la ricorsione.

Un po 'più integrato:

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

non funziona nelle versioni API più recenti. riuscito questo http://stackoverflow.com/questions/6579769/automatically-check-uncheck-all-subtree-nodes-in-extjs-tree-when-certain-node-ge – pahan

+0

Questo è corretto. Il codice sopra è per Ext JS 3, Ext JS 4 ha cambiato abbastanza pesantemente l'API dell'albero. –

+2

Quindi, se non si espandono i nodi figlio, non verranno caricati. Quindi quando chiami checkchange controllerà solo i nodi figli che sono stati caricati. Quello che ho finito è stato aggiungere node.expand (true); before node.eachChild, quindi espande tutti i nodi e quindi li controlla tutti. – Grammin

0

Il JSON o XML avranno bisogno del "controllato" proprietà è impostata su true o false quando si popola i nodi. Suppongo che tu stia utilizzando un AsyncTreeNode per fare questo per te. Se i nodi dell'albero vengono creati senza questa proprietà selezionata, ExtJS non eseguirà il rendering con la casella di controllo.

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

Funziona bene per me;)

+0

Funziona bene! Almeno in Chrome non ho il seguente errore: "Dimensione massima dello stack delle chiamate superata" =) –

2

ascoltatori: {

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

Alcune brevi spiegazioni sarebbero state utili. –

-1

Oppure, se come me, è necessario controllare automaticamente/deselezionare la nodo genitore quando tutti i nodi foglia figlio sono spuntati/deselezionati puoi provare questo:

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 risposta di Mr C funziona correttamente (ExtJS 4.2), ma si verificherà un errore quando i childnodes di parentnode hanno 1 figlio. Ecco un mio piccolo miglioramento. Qualcuno può migliorare ulteriormente

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); 
     }); 
    } 
}