extjs treepanel加载子级而不展开

extjs treepanel加载子级而不展开,extjs,treepanel,Extjs,Treepanel,我使用extjs3.4。我正在使用复选框解决方案制作TreePanel 我需要的是:当我检查父节点时,所有子节点也被检查。这很简单,但它依赖于extjs扩展所有子节点 如果我这样做 tree.expandAll(); tree.collapseAll(); 我的检查策略会起作用,但我不想要扩大效应 我的extjs代码(checkchange event)如下所示: var checkchange = function(node, flag) { if (node.hasChi

我使用extjs3.4。我正在使用复选框解决方案制作TreePanel

我需要的是:当我检查父节点时,所有子节点也被检查。这很简单,但它依赖于extjs扩展所有子节点

如果我这样做

tree.expandAll();
tree.collapseAll();
我的检查策略会起作用,但我不想要扩大效应

我的extjs代码(
checkchange event
)如下所示:

var checkchange = function(node, flag) {

        if (node.hasChildNodes()) {
            node.cascade(function(node) {
                node.attributes.checked = flag;
                node.ui.checkbox.checked = flag;
                return true;
            });
        }

        var pNode = node.parentNode;
        for (; pNode != null; pNode = pNode.parentNode) {
            if (flag || tree.getChecked("checked", pNode).length - 1 == 0) {
                pNode.attributes.checked = flag;
                pNode.ui.checkbox.checked = flag;
            }
        }
    };

var tree = new Ext.tree.TreePanel({

    listeners: {
        'checkchange': checkchange
    },
})
我该怎么办?感谢每一位提出建议的人

[编辑]

我创建的,可以很容易地测试


(由于被not work使用,我从中附加了另一个cdn extjs资源)

我不确定在检查根节点时是否真的希望逐个节点加载整个树。我建议在为已检查的父节点加载子节点时,通过附加到
load
事件来延迟检查子节点。大概是这样的:

load:function(me, node) {
    if(node && node.attributes.checked) node.cascade(
        ... [function to check all children]
    )
}
根据进一步处理的意图和树的大小,这可能比扩展整个树以渲染和选中所有复选框要好


如果您希望直接加载树,我建议在TreeLoader上使用。这比手动实现级联加载更容易。

我不确定在检查根节点时是否真的希望逐个节点加载整个树。我建议在为已检查的父节点加载子节点时,通过附加到
load
事件来延迟检查子节点。大概是这样的:

load:function(me, node) {
    if(node && node.attributes.checked) node.cascade(
        ... [function to check all children]
    )
}
根据进一步处理的意图和树的大小,这可能比扩展整个树以渲染和选中所有复选框要好


如果您希望直接加载树,我建议在TreeLoader上使用。这比手动实现级联负载更容易。

我并没有真正解决这个问题。但我得到了一个折衷的解决方案

  • 仅在需要时扩展

    checkchange : function(node, flag){
    
        node.cascade(function(node) {
            // when you check, first expand, then child nodes can be checked too
            if(node.expanded == false)
                node.expand(true);
            node.attributes.checked = flag;
            node.ui.checkbox.checked = flag;
            return true;
        });
        ......
    }
    
  • 这将满足所有子节点都应该展开的前提条件。但也不需要在首次加载时进行扩展

  • 如果第一次加载时选中父节点,则需要展开所有子节点

    this.treeLoader = new Ext.tree.TreeLoader({
        url : 'xxx',
        baseParams  : {
            someparam: ""
        },
        listeners : {
            'load' : function(tree,node,response) {
                var res = Ext.util.JSON.decode(response.responseText);
                if(res.success != undefined && !res.success) {
                    Ext.Msg.alert('Hint', res.message);
                    return;
                }
                node.cascade(function(node) {
                    if(node.attributes.checked == true) {
                        node.expand(true);
                    }
                });
            },
    
        }
    });
    
  • 这两种方法解决了我的问题,虽然不是很完美


    希望这能帮助其他人。

    我并没有真正解决这个问题。但我得到了一个折衷的解决方案

  • 仅在需要时扩展

    checkchange : function(node, flag){
    
        node.cascade(function(node) {
            // when you check, first expand, then child nodes can be checked too
            if(node.expanded == false)
                node.expand(true);
            node.attributes.checked = flag;
            node.ui.checkbox.checked = flag;
            return true;
        });
        ......
    }
    
  • 这将满足所有子节点都应该展开的前提条件。但也不需要在首次加载时进行扩展

  • 如果第一次加载时选中父节点,则需要展开所有子节点

    this.treeLoader = new Ext.tree.TreeLoader({
        url : 'xxx',
        baseParams  : {
            someparam: ""
        },
        listeners : {
            'load' : function(tree,node,response) {
                var res = Ext.util.JSON.decode(response.responseText);
                if(res.success != undefined && !res.success) {
                    Ext.Msg.alert('Hint', res.message);
                    return;
                }
                node.cascade(function(node) {
                    if(node.attributes.checked == true) {
                        node.expand(true);
                    }
                });
            },
    
        }
    });
    
  • 这两种方法解决了我的问题,虽然不是很完美


    希望这能帮助其他人。

    如果你共享一把小提琴,帮助会更容易。子部分的
    扩展:真/假
    配置如何?如果你共享一把小提琴,帮助会更容易。子部分的
    扩展:真/假
    配置如何?谢谢。实际上,在开始时,并没有检查所有节点。如果我检查根节点,则只检查根节点,而不检查所有子节点。这不是我的目的。如果先展开然后选中根节点,子节点也将被选中。@AylwynLake我在回答中添加了另一种可能性。我已经测试了
    preload-children:true
    ,它不起作用。你能检查一下我文章编辑栏中的演示链接吗?谢谢。实际上,在开始时,并没有检查所有节点。如果我检查根节点,则只检查根节点,而不检查所有子节点。这不是我的目的。如果先展开然后选中根节点,子节点也将被选中。@AylwynLake我在回答中添加了另一种可能性。我已经测试了
    preload-children:true
    ,它不起作用。你能在我的帖子的编辑栏中查看演示链接吗?