JSTree竞争条件,其中AJAX成功回调可能有错误的节点

时间:2012-08-22 14:20:43

标签: jquery jstree race-condition

我有一个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. 一种锁定树的方法,以便在第一个返回之前它不接受点击? (不太理想,但也可能有效。)

1 个答案:

答案 0 :(得分: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标志为false,以防止树接受节点选择。