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

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

【问题讨论】:

    标签: javascript treeview dojo 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]); 打开您想要打开的那些
    猜你喜欢
    • 1970-01-01
    • 2012-06-05
    • 1970-01-01
    • 1970-01-01
    • 2022-11-19
    • 2014-09-04
    • 2018-10-15
    • 2021-07-23
    • 1970-01-01
    相关资源
    最近更新 更多