【发布时间】:2012-05-24 07:05:40
【问题描述】:
我有一个延迟加载 dijit.tree,我想在加载数据后在许多地方重复使用它。但是,如果我只是将其他树中的存储对象替换为包含最多数据的存储对象,那么节点就会全部展开。我想修改商店,以便在将其设置为新树中的商店之前折叠所有项目。你能告诉我如何做到这一点吗?
【问题讨论】:
标签: javascript treeview dojo dijit.tree
我有一个延迟加载 dijit.tree,我想在加载数据后在许多地方重复使用它。但是,如果我只是将其他树中的存储对象替换为包含最多数据的存储对象,那么节点就会全部展开。我想修改商店,以便在将其设置为新树中的商店之前折叠所有项目。你能告诉我如何做到这一点吗?
【问题讨论】:
标签: javascript treeview dojo dijit.tree
您不能为此使用存储,因为它不包含树节点状态的任何信息。这个“魔法”是通过TreeNode 执行的,见一些examples here
“完美解决方案”是找出需要扩展的路径,然后设置树的路径以遍历所需的树节点。
但是,由于您的延迟加载,您需要检查state - 在初始化树时它应该是UNCHECKED。但是有一个内置的 cookie 功能可能正在启动,请确保使用 { persist:false } 创建新树
您还可以扩展您的树,使其接受 collapseChildren(TreeNode),如下所示 - 然后调用 tree.set("path", [pathsArray]);
collapseChildren : function(top) {
var self = this;
if(!top || !self.model.mayHaveChildren(top.item)) return;
top.getChildren().forEach(function(n) {
if(n.item.children) {
//dojo.style(n.getParent().containerNode, { overflowY: 'hidden', overflowX: 'hidden'});
self._collapseNode(n);
self.collapseChildren(n);
}
});
},
编辑:
如果将 autoExpand 标志传递给构造函数,则树最初会显示为所有节点都展开。
然后您可以调用 collapseAll() 和 expandAll() 来分别折叠和展开树。 http://livedocs.dojotoolkit.org/dijit/Tree-examples#id3
【讨论】:
tree.set("path", [pathsArray]); 打开您想要打开的那些