jstree触发排序插件

时间:2015-01-28 09:14:23

标签: javascript jquery sorting jstree

找到"功能"在jstree中,我现在花了大部分时间试图找出如何在jstree中触发排序插件。

我正在使用jstree,并希望以类似于文件系统的样式对其进行排序,其中包含子元素的元素组合在一起。 (即文件夹/目录)和没有子项(文件)的元素组合在一起,排序插件并不总是按预期工作。

为此,我在树构造中添加了以下内容:

$(jQueryIdString).jstree({
        'core': { check_callback: true },
        "plugins": ["search", "sort"],
        'sort': function (a, b) {
            var nodeA = this.get_node(a);
            var nodeB = this.get_node(b);
            var lengthA = nodeA.children.length;
            var lengthB = nodeB.children.length;                
            if ((lengthA == 0 && lengthB == 0) || (lengthA > 0 && lengthB > 0))
                return this.get_text(a).toLowerCase() > this.get_text(b).toLowerCase() ? 1 : -1;
            else
                return lengthA > lengthB ? -1 : 1;
        }
});

但是当我允许用户动态添加元素时遇到了麻烦。

案例是你添加的最后一个元素是"文件夹",但是还没有孩子所以它按字母顺序排序,然后你添加一个"文件"在那个文件夹中。 - 但这不会对父母进行重新排序,因为jstree排序并没有意识到孩子可能会影响父母吗?

要修复此问题而不重新设计如何构建树,我最终使用了类似这样的代码(我不满意):

var selector = '#treeId';
var root = $(selector).jstree(true).get_node("root_anchor")
var dummyNode = $(selector).jstree(true).create_node(root, "sorting dummy node");
$(selector).jstree(true).delete_node(dummyNode);

我还没有确定你是否需要为所有孩子(有孩子)做这件事

如果有人找到了更好的方法,我会非常感激。

如果您看到API,您会注意到有一种方法:

.is_parent(node)
可以使用

代替children.length。

但它并没有解决我的问题。我从那开始,但后来开始检查孩子们,发现实际上在分拣时没有孩子......

我不会使用类型插件,除非我必须! 这实际上不是一个文件系统!

**我该怎么做? **

要求:

  1. 我需要添加一个新的子节点
  2. 如果这需要父母搬家 来自"组"那个没有孩子的小组 应妥善排序。

1 个答案:

答案 0 :(得分:1)

要触发排序,您应该能够:

$(selector).jstree(true).sort(root, true);
$(selector).jstree(true).redraw_node(root, true);