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..
除非万不得已,否则我不会使用类型插件!
这实际上不是文件系统!
**我应该怎么做? **
要求:
- 我需要添加一个新的child节点
- 如果这需要 parent 移动
从没有children的"group"到有的组,它
应该正确排序。
要触发排序,您应该能够做到:
$(selector).jstree(true).sort(root, true);
$(selector).jstree(true).redraw_node(root, true);
在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..
除非万不得已,否则我不会使用类型插件! 这实际上不是文件系统!
**我应该怎么做? **
要求:
- 我需要添加一个新的child节点
- 如果这需要 parent 移动 从没有children的"group"到有的组,它 应该正确排序。
要触发排序,您应该能够做到:
$(selector).jstree(true).sort(root, true);
$(selector).jstree(true).redraw_node(root, true);