现在有多层节点的tree  要实现 选择一个节点   将其父节点选择且将其所有的子节点选择,
但其一的话我现在是实现了 但是就是放在一起同时实现不了  算法太难了 主要是嵌套
选中父节点:tree.on('checkchange', function(node, flag) {
// 所有父节点选中
  if (node.parentNode.id != 'root') {// 判断是不是root节点
if (flag || tree.getChecked(id, node.parentNode) == "") {// 如果该节点的父节点还有子节点被选者则父节点继续选择
node.parentNode.ui.toggleCheck(flag);
node.parentNode.attributes.checked = flag;
node.parentNode.fireEvent('checkchange', node.parentNode, flag);//递归调用
}
}
}); 选中子节点: tree.on('checkchange', function(node, flag) {
// 所有子节点选中
if (node.hasChildNodes()) {
node.eachChild(function(child) {
child.ui.toggleCheck(flag);
child.attributes.checked = flag;
child.fireEvent('checkchange', child, flag);//递归调用
});
} }); 

解决方案 »

  1.   

      tree.on('checkchange', function(node, checked) {      
            node.expand();      
            node.attributes.checked = checked;
            node.eachChild(function(child) {      
                child.ui.toggleCheck(checked);      
                child.attributes.checked = checked; 
                child.fireEvent('checkchange', child, checked);      
            });      
        }, tree);    
      

  2.   

    tree.on('checkchange', function(node, flag) {   
        // 所有父节点选中   
        // Ext.log(node+"======"+node.parentNode);   
        // j=node;   
        if (node.parentNode.id != 'root') {// 判断是不是root节点   
            if (flag || tree.getChecked(id, node.parentNode) == "") {// 如果该节点的父节点还有子节点被选者则父节点继续选择   
                node.parentNode.ui.toggleCheck(flag);   
                node.parentNode.attributes.checked = flag;   
                node.parentNode.fireEvent('checkchange', node.parentNode, flag);//递归调用   
            }   
        }   
    });  
      

  3.   


    //使该节点路径上的父节点与该节点一致
    personTree.on('checkchange', function(node, checked) {
        node.attributes.checked = checked;
        //使到该节点的路径上的节点均为选中状态 
        if(checked){
            //判断不是root节点  
             if (node.parentNode.id != 'perRoot') {
                //若父节点没有选中,则继续向上选中父节点 
                 if(!node.parentNode.checked){
                    node.parentNode.ui.toggleCheck(checked);   
                    node.parentNode.attributes.checked = checked;   
                    //递归调用 
                      node.parentNode.fireEvent('checkchange', node.parentNode, checked); 
                }
     }else{
        node.parentNode.ui.toggleCheck(checked);   
                node.parentNode.attributes.checked = checked; 
    }
        }else{
    if (node.parentNode.id != 'perRoot') {     
        //如果父节点没有被选中的子节点,则设为非选中状态
        if(!node.parentNode.findChild('checked',true)){    
    node.parentNode.ui.toggleCheck(checked);
    node.parentNode.attributes.checked = checked; 
    //递归调用 
    node.parentNode.fireEvent('checkchange', node.parentNode,checked); 
        }
    }else{
        if(!node.parentNode.findChild('checked',true)){
                    node.parentNode.ui.toggleCheck(checked);
    node.parentNode.attributes.checked = checked;           }
    }
        }
    }); 
      

  4.   

    /** 取得一个节点的所有子节点 */ 
    function getAllChildrenNodes(node){
    var children = [];
    if(!node.isLeaf()){//是目录
    //node.expand();
    for(var i=0;i<node.childNodes.length;i++){
    children.push(node.childNodes[i]);
    children = children.concat(getAllChildrenNodes(node.childNodes[i]));
    }
     }
    return children; 
    }/**子节点选中,其祖上节点亦选中*/
     function checkAncestor(node, checked) {
    //获取所有子节点
    node.cascade(function(node){
       node.expand();
       node.attributes.checked = checked;
       node.ui.checkbox.checked = checked;
       return true;
        });
        //获取所有父节点
        var pNode = node.parentNode;
    while(pNode.id !="0"){//子节点选中,父节点也被选中
    if (checked || node.getOwnerTree().getChecked(id,pNode)== "") {
             pNode.ui.checkbox.checked = checked;
             pNode.attributes.checked = checked;
        }else{
         var childNodes = getAllChildrenNodes(pNode);//获取被选中节点的所有子节点,若子节点还有被选中的,被选中的节点(即父节点)不勾掉
         for (var i = 0; i < childNodes.length; i++) {
      if (node.getOwnerTree().getChecked(id,childNodes[i])!= "") {
        pNode.ui.checkbox.checked = checked;
              pNode.attributes.checked = checked;
        }
    }
        }
    pNode = pNode.parentNode;
    }
        /*for(; pNode.id !="perRoot"; pNode = pNode.parentNode ){
        
        }*/
    }
      

  5.   


    //这个方法是选择父节点,自动选中所有的子节点
    function a(node,checked){
        checked?node.expand():node.collapse();
        if(node.hasChildNodes()){
            node.eachChild(function(child) {
                child.attributes.checked = checked;
        var cb = child.ui.checkbox;
        if(cb) cb.checked = checked;
               a(child,checked);
    });
    }
    }
    //这个方法是选择子节点,自动选中父节点的父节点
    function b(node,checked){
        if(checked){
            node.expand();
    var parentNode = node.parentNode;
    if(parentNode!=undefined){
             parentNode.attributes.checked = checked;
             var cb = parentNode.ui.checkbox;
                if(cb) cb.checked = checked;
                b(parentNode,checked);
            }
            }
    }
    //这两个方法要在treepanel的checkchange里调用.
      

  6.   

    // 全选父节点和子节点 @ 反选子节点
    checkTree.on('checkchange', function(node, checked) {
    selParent(node, checked);
    selChild(node, checked); });
    // 全选父节点
    function selParent(node, checked) {
    if (checked) {
    if (node.parentNode.id!="service_root_check_node") {// 判断是不是root节点
    node.parentNode.ui.checkbox.checked = checked;
    node.parentNode.attributes.checked = checked;
    selParent(node.parentNode, checked);
    }
    }
    }
    // 全选或者反选子节点
    function selChild(node, checked) {
    node.eachChild(function(child) {
    child.ui.checkbox.checked = checked;
    child.attributes.checked = checked;
    selChild(child, checked);
    }); }