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. 如果这需要父母搬家从没有孩子的"组"到有孩子的组,它应正确排序。

要触发排序,您应该能够执行以下操作:

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

最新更新