1

我有一个 jstree 的 json_data 实现,它允许用户打开树中的不同节点并查看内容。本质上是这样的:

               .jstree({
                "plugins" : [ "json_data", "ui" ],
                "ui" : { "select_multiple_modifier": "on",
                         "selected_parent_close": "deselect" },
                "json_data" : {
                    "ajax" : {
                        "url": function(node) {
                            ... return a url ...
                        },
                        "success": function(metadata, textStatus, jqXHR) {
                            var parent = this._get_node();  // <- RACE CONDITION
                            return parseMetaDataNodes(metadata, parent);
                        }
                    }
                }

如果用户在第一个返回的 AJAX 响应之前以某种方式单击了两个节点,它将认为它们在树中都有相同的“父节点”,从而破坏了行为。

有谁知道:

  1. 在成功回调中获取正确节点的更好方法?
  2. 一种锁定树的方法,使其在第一个返回之前不接受点击?(不太理想,但也可能有效。)
4

1 回答 1

2

我遇到了一个类似的问题,我最终选择了你的第二个解决方案,即防止进一步的 select_node 函数执行,直到一个标志被清除:

 $("#treeHost").jstree({Your Plugin setup code}).bind("before.jstree", function(event, data) {
                if (data.func == "select_node" && !canSelectNodes) {
                    event.stopImmediatePropagation();
                    return false;
                }
            })

根据官方文档,before.jstree是一个可以绑定的特殊事件,以防止操作执行。我检查要执行的函数是否为,如果是,如果为假select_node,则不要执行它。canSelectNodes

这样,您可以canSelectNodes在代码的其他地方切换标志 true 或 false,以防止树接受节点选择。

于 2012-08-22T22:52:12.787 回答