2010-02-16 9 views

Respuesta

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 quieres que esto funcione en todo el subárbol del nodo actual, que tendrá que hacer un poco de recursividad.

Un poco más integrado:

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

no funciona en versiones de API más nuevas. sucedió esto http://stackoverflow.com/questions/6579769/automatically-check-uncheck-all-subtree-nodes-in-extjs-tree-when-certain-nodege – pahan

+0

Eso es correcto. El código anterior es para Ext JS 3, Ext JS 4 cambió el árbol API bastante. –

+2

Entonces, si no expandes los nodos secundarios, no se cargarán. Por lo tanto, cuando llame a checkchange solo revisará los nodos secundarios que se hayan cargado. Lo que terminé haciendo fue agregar node.expand (true); before node.eachChild, por lo tanto, expande todos los nodos y luego los verificará a todos. – Grammin

0

El JSON o XML necesitarán el "marcado" propiedad establecida en verdadero o falso al rellenar los nodos. Supongo que está usando un AsyncTreeNode para hacer esto por usted. Si los nodos de árbol se crean sin esta propiedad marcada presente, ExtJS no lo renderizará con la casilla de verificación.

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

Funciona bien para mí;)

+0

¡Funciona bien! Al menos en Chrome no tengo el siguiente error: "Se excedió el tamaño máximo de la pila de llamadas" =) –

2

oyentes: {

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

Alguna breve explicación habría sido útil. –

-1

O bien, si como yo, es necesario comprobar de forma automática/desactive la nodo padre cuando todos los nodos hoja hijos están marcados/desmarcados puede intentar esto:

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 respuesta de Mr C funciona bien (ExtJS 4.2), pero se producirá un error cuando los childnodes de parentnode tienen 1 hijo. Aquí está mi pequeña mejora. Alguien puede mejorar aún más

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