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

Posted

技术标签:

【中文标题】dijit.tree 如何仅使用商店实现折叠所有功能?【英文标题】:dijit.tree how to implement a collapse all functionality using only store? 【发布时间】:2012-05-24 07:05:40 【问题描述】:

我有一个延迟加载 dijit.tree,我想在加载数据后在许多地方重复使用它。但是,如果我只是将其他树中的存储对象替换为包含最多数据的存储对象,那么节点就会全部展开。我想修改商店,以便在将其设置为新树中的商店之前折叠所有项目。你能告诉我如何做到这一点吗?

【问题讨论】:

【参考方案1】:

您不能为此使用存储,因为它不包含树节点状态的任何信息。这个“魔法”是通过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

【讨论】:

看问题是,当我只将旧树的存储设置为新树的存储时,我看到节点完全按照它们在前一个树中的扩展。所以我认为它是基于商店的。 尝试使用 persist:false 如上所述?树上的点击会生成一个 cookie,用于在页面加载之间存储树路径,认为这可能是同一件事吗?您新创建的树是否会在“打开”子容器上触发 XHR? 确保 autoExpand 标志为 false,然后使用 tree.set("path", [pathsArray]); 打开您想要打开的那些

以上是关于dijit.tree 如何仅使用商店实现折叠所有功能?的主要内容,如果未能解决你的问题,请参考以下文章

dijit.Tree 重新加载时不会崩溃

在 dijit.Tree 中搜索

使用“之前”选项将项目添加到道场商店

如何在 dijit.Tree 中禁用多个节点选择?

带有提交错误值的单选按钮的 Dijit.tree 扩展

dojo组件使用---tree组件的局部更新