我发现我无法删除尚未渲染的节点。以下代码显示了我的意思。我在http://dev.sencha.com/deploy/dev/exa...dow/hello.html上的Chrome(和Firebug)命令行中运行它(因为该页面预装了ext)
我分别键入每个语句以确保异步操作没有问题(即使树数据在内存中)
Ext.getBody.update('');
// Tree with preloaded nodes in memory
var tree = new Ext.tree.TreePanel({
renderTo: Ext.getBody(),
width: 300,
height: 500,
rootVisible: false,
loader: new Ext.tree.TreeLoader({preloadChildren:true}),
root: new Ext.tree.AsyncTreeNode({
expandend: true,
children: [
{text: 'Folder 1', id: 'folder1', leaf: false, children: [
{text: 'File 1', id: 'file1', leaf: true},
{text: 'File 2', id: 'file2', leaf: true}
]}
]
})
});
// Try to delete 'File 1', notice that the folder has never been expanded
tree.getRootNode().childNodes[0].childNodes[0].remove(true);
// Expand the node and see that 'File 1' is still there
tree.getRootNode().childNodes[0].expand();
// Delete the first child 1 again, it works now that it's been rendered
tree.getRootNode().childNodes[0].childNodes[0].remove(true);
有关该怎么做的任何建议?
答案
var nodeToRemove = tree.getRootNode().childNodes[0].childNodes[0];
if (!nodeToRemove.rendered) {
var children = node.parentNode.attributes.children;
Ext.each(children, function(child, index){
if (child.id == nodeToRemove.id) {
chilren.splice(index, 1);
return false;
}
}) ;
} else {
nodeToRemove.remove(true);
}
答案 0 :(得分:3)
Ext.tree.TreePanel是我最讨厌的组件之一(其次是FormPanel)。
以下是发生的事情:TreeLoader从其原始配置对象预加载根节点的子节点,调用AsyncTreeNode.expand也是如此,这将基本上重置树。
所以,在扩展之前,你必须从rootNode的配置中删除节点:
tree.getRootNode().attributes.children[0].children.shift();
编辑:实际上,这更直观:
tree.getRootNode().childNodes[0].attributes.children.shift();
(同样的事情,因为root.childNodes[0].attributes === root.attributes.children[0]
)
答案 1 :(得分:1)
我终于明白了,实际上来自Ext-JS支持的Condor为我找到了它。
问题在于,默认情况下,TreeLoader会在调用TreeLoader #reload时清除其子节点(如果clearOnLoad选项为true(默认值),则由AsyncTreeNode #extens()调用它。
(TreeLoader) load : function(node, callback, scope){
if(this.clearOnLoad){
while(node.firstChild){
node.removeChild(node.firstChild);
}
}
if(this.doPreload(node)){ // preloaded json children
this.runCallback(callback, scope || node, [node]);
}
因此使用clearOnLoad: false
创建我的树装入器可以解决我的问题。除非我删除所有子节点。为了解决这个问题,我需要以下补丁:
Ext.tree.TreeLoader.prototype.doPreload =
Ext.tree.TreeLoader.prototype.doPreload.createSequence(
function(node){
if (node.attributes.children) {
node.attributes.children = [];
}
}
);
这是ext-js线程的链接:
@Pumbaa:这是一个解决方案,而不是你建议的解决方法,但我非常感谢你的帮助。
答案 2 :(得分:-1)
在展开treenode之前,这些项目尚未初始化为ExtJS组件。在那之前,他们只是坐在子项目数组(xtyped标准javascript对象)中,查看API文档中的TreeNode.childNodes。尝试从该阵列中删除它们,然后展开该项目。那应该是诀窍
干杯, 罗布