我设法创建了一个动态加载子节点的Ext.tree.TreePanel,但是我很难清除树并用新数据加载它。有人可以帮我写代码吗?
7 回答
来自 ExtJS 大师 Saki 的精彩博客。
while (node.firstChild) {
node.removeChild(node.firstChild);
}
http://blog.extjs.eu/know-how/how-to-remove-all-children-of-a-tree-node/
在 Ext JS 4 中:
如果要重新加载树面板的数据,则需要重新加载树存储:
getCmp('treeId').getStore().load();
其中 treeId 是树的 id。如果您有商店 id,您可以直接在商店 id 上使用 load()。
删除所有子节点:
getCmp('treeId').getRootNode().removeAll();
但是,从其存储区重新加载树节点不需要删除子节点。
在我的例子中,我的 Ext 树有一个 AsyncTreeNode 类型的隐藏根节点。如果我想清除树并从服务器重新填充,这很简单:
tree.getRootNode().reload();
我终于在他们的论坛上找到了答案。对于任何有兴趣的人来说,这里是:
if (tree)
{
var delNode;
while (delNode = tree.root.childNodes[0])
tree.root.removeChild(delNode);
}
您可以简单地使用node.removeAll()
从该节点中删除所有子节点。
http://docs.sencha.com/extjs/4.2.1/#!/api/Ext.data.NodeInterface-method-removeAll
我遇到了类似的问题,我想出的解决方案是“标记”节点在折叠时尚未加载,从而在重新展开时强制重新加载。
listeners: {
collapsenode: function(node){
node.loaded = false;
},
if (tree) { var delNode; while (delNode = tree.root.childNodes[0]) tree.root.removeChild(delNode); }
I don't know Ext, but I'm guessing that they have DOM abstraction that might make that easier. An equivalent in Prototype would be something like:
tree.root.immediateDescendants().invoke('remove'); // or
tree.root.select('> *').invoke('remove');
Unless tree.root
refers to a collection object rather than the tree's root DOM node, but is borrowing DOM API method names? That seems really unlikely, especially for a modern JS library.