单击父级时检查树的子节点[ExtJS]

时间:2010-02-16 07:13:00

标签: extjs tree extjs3

我想知道如何在点击ExtJs中的特定节点时检查树的兄弟节点。

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

有人请帮帮我..

7 个答案:

答案 0 :(得分: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);
    });
});

答案 1 :(得分: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);

对我来说效果很好;)

答案 2 :(得分:2)

听众:{

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

}

答案 3 :(得分:1)

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

答案 4 :(得分:1)

C先生的答案很好(ExtJS 4.2),但是当parentnode的子节点有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);
        });
    }
}

答案 5 :(得分:0)

当您填充节点时,JSON或XML将需要将“checked”属性设置为true或false。我假设您正在使用AsyncTreeNode为您执行此操作。如果创建树节点时没有显示此已检查属性,则ExtJS将不会使用复选框对其进行渲染。

答案 6 :(得分:-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); });
    }


}