dijit.tree如何实现一个折叠所有功能只使用商店?

我有一个懒加载dijit.tree,我想在其数据加载后在许多地方重用。但是,如果我只是将其他树中的商店对象替换为包含大多数数据的商店对象,则节点将全部展开。我想修改商店,以便在将所有商品设置为新树中的商店之前将其折叠。你能告诉我如何做到这一点?

0
额外
意见: 1

1 答案

You cannot use the store for this, as it does not contain any information of the state of the tree nodes. This 'magic' is performed via TreeNode, see some examples here

'完美的解决方案'是找出你需要扩展的路径,然后设置树的路径以遍历所需的treenodes。

However, since your lazyloading, you need to check the state - while initializing a tree it should be UNCHECKED. However there is a cookie-functionality inbuilt which probably is kicking in, make sure to create new tree's with { persist:false }

You could also extend your tree, so that it will accept collapseChildren(TreeNode) as follows - and then call 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
0
额外
看起来问题是,当我只将旧树的存储设置为新树的存储时,我看到这些节点的扩展与前一棵树完全相同。所以我认为它是基于商店的。
额外 作者 MozenRath,
只有当孩子还没有入住时,他们才会开火
额外 作者 MozenRath,
谢谢@mschr!
额外 作者 MozenRath,
如上所述尝试使用persist:false?树上的点击会生成一个cookie,用于在页面加载之间存储树路径,认为它可能与此处相同?您新创建的树在'开放'子容器上触发XHR吗?
额外 作者 mschr,
确保autoExpand标志为false,然后使用 tree.set(“path”,[pathsArray]); 打开你想要打开的那些
额外 作者 mschr,