2010-02-16 50 views
9

我想知道如何在ExtJs中单击特定节点时检查树的兄弟节点。单击父级时检查树的子节点[ExtJS]

我已经给每个节点的ID,我可以访问被点击的节点的ID。那么我该如何继续自动检查子节点?

有人请帮助我..

回答

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

如果你想这对当前节点的整个子树工作,你就必须做一些递归。

多一点综合:当您填充节点

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

在较新的API版本中不起作用。成功了这个http://stackoverflow.com/questions/6579769/automatically-check-uncheck-all-subtree-nodes-in-extjs-tree-when-certain-node-ge – pahan

+0

这是正确的。上面的代码用于Ext JS 3,Ext JS 4相当大地改变了树API。 –

+2

因此,如果您不扩展子节点,它们将不会加载。所以当你调用checkchange时,它只会检查已经加载的子节点。我最终做的是添加node.expand(true);在node.eachChild之前,因此它展开所有节点,然后将它们全部检查。 – Grammin

0

的JSON或XML将需要“选中”属性设置为true或false。我假设你正在使用AsyncTreeNode为你做这个。如果树节点的创建没有此检查属性,ExtJS将不会使用复选框进行渲染。

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

它很适合我;)

+0

工作正常!至少在Chrome中,我没有出现以下错误:“超出最大调用堆栈大小”=) –

2

听众:{

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

一些简要说明会有帮助。 –

-1

或者,如果你像我一样需要自动选中/取消父节点当所有的子叶节点被选中/取消选中时,你可以试试这个:

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

C先生的答案工作正常(ExtJS 4.2),但是当parentnode的childnodes有1个孩子时会发生错误。这是我的一点改进。有人可以进一步改进

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); 
     }); 
    } 
} 
相关问题