extjs treepanel加载子级而不展开
我使用extjs3.4。我正在使用复选框解决方案制作TreePanel 我需要的是:当我检查父节点时,所有子节点也被检查。这很简单,但它依赖于extjs扩展所有子节点 如果我这样做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
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
,它不起作用。你能在我的帖子的编辑栏中查看演示链接吗?