找到"功能"在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。
但它并没有解决我的问题。我从那开始,但后来开始检查孩子们,发现实际上在分拣时没有孩子......
我不会使用类型插件,除非我必须! 这实际上不是一个文件系统!
**我该怎么做? **
要求:
答案 0 :(得分:1)
要触发排序,您应该能够:
$(selector).jstree(true).sort(root, true);
$(selector).jstree(true).redraw_node(root, true);