jstree 触发排序插件

jstree triggering the sort plugin

在jstree中找到"feature"之后,我现在花了大半天时间试图找出如何在jstree中触发排序插件。

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

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

$(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;
        }
});

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

情况是你添加的最后一个元素是"folder",但是没有children所以它是按字母顺序排序的,然后你添加一个"file"那个文件夹。 - 但这不会 re-sort parent,因为 jstree 排序没有意识到 children 可能会影响 parents??

为了在不重新设计构建树的方式的情况下解决这个问题,我最终使用了类似下面的代码(我对此并不满意):

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);

我还不确定您是否需要对所有 children(有 children)

执行此操作

如果有人找到更好的方法来做到这一点,我将不胜感激。

如果你看到API,你会注意到有一个方法:

.is_parent(node)

可以用来代替children.length。

但是并没有解决我的问题。我从那开始,但后来开始检查 children,发现实际上在排序时没有 children..

除非万不得已,否则我不会使用类型插件! 这实际上不是文件系统!

**我应该怎么做? **

要求:

  1. 我需要添加一个新的child节点
  2. 如果这需要 parent 移动 从没有children的"group"到有的组,它 应该正确排序。

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

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