jsTree排序函数回收

jsTree sort function recycling

我手上有多个 jstrees。我为每个添加了 sort 插件并配置:

  "core": { .. },
  "plugins": ['sort', ..],
  "sort": action_sort,
  ...

然后我开始编写以下有问题的函数:

/** @param id_node{1,2}: Despite of what can be read here: https://www.jstree.com/api/#/?f=$.jstree.defaults.sort
 *   this function will receive 2 strings with the _id_s of the nodes to be sorted, not the nodes themselves.
 * @return 1 or -1. Will cause the nodes to be sorted alphanumerically using String.localeCompare(..). */
function action_sort(id_node1, id_node2)
{
    let node1 = $('#navtree').jstree(true).get_node(id_node1);
    let node2 = $('#navtree').jstree(true).get_node(id_node2);
    let code = node1.text.localeCompare(node2.text);
    return (code >= 0) ? 1 : -1;
}

问题在于硬编码字符串 #navtree 显然只适用于具有此 ID 的树。

现在,在 documentation 中,他们声明排序函数 在树的上下文 中执行。所以我开始尝试 $(this) 在不断增长的树上获得一个复杂的非常大的内部数据结构。

进一步的实验试图找到 $('#'+id_node1) 的第一个父代持有 role='tree' 属性。然而,在排序时,节点仍然无法通过这种方式获得。

当然,我可能会为每棵树使用柯里化或自动生成自定义排序函数。

但真正的问题是:我的 action_sort(id_node1, id_node2) 函数是否有更简单的方法来了解它 运行 所在的树,利用它是 运行 在 "the tree's context" 中?或者更重要的是:获得一个句柄,我可以从中调用 .get_node(node_id)?

如果您查看默认排序处理程序 $.jstree.defaults.sort 函数,您会发现它在函数的上下文中使用了 get_text 函数。您可以在任何 jsTree 实例的代码中使用此函数

function (id_node1, id_node2) {
    return this.get_text(id_node1).localeCompare(this.get_text(id_node2));
}