JsTree选择正在逆转

时间:2016-08-03 07:48:49

标签: javascript jquery ajax jstree

所以我的问题是,基本上,我在JsTree中设置了一些节点,它在我已经在我的页面上的一棵树上工作,但是那些动态加载的节点只能恢复选择。这意味着它们确实按预期被选中,但之后由于某种原因被取消选择。

选择代码:

selected.forEach(function(element,index,array){
    if(element !== null)
        $(value).parent().find(".filter-value-tree").jstree("select_node", "#"+element);
});

jquery-2.1.1.js中的代码行:

return typeof n !== U && n.event.triggered !== b.type ? n.event.dispatch.apply(a, arguments) : void 0

在该特定行之前,节点按预期选择。

显示我正在尝试做的基础知识的片段(它现在可以再现问题):

$("#testBtn").on("click", function() {
  loadTree(getValueTree);


  $("#filter-value-tree").jstree("select_node", "#2");
});

function loadTree(callback){
  //Normally there would be a ajax request here, to be used with differenct callback functions
  var response = '<li id="1">Information</li><li id="2">Service</li><li id="3">Claim</li><li id="4">Education</li>';
  
  setTimeout(function(){
    callback(response);
  }, 1000);
}

function getValueTree(result){
    $("#testDiv").append("<div id='filter-value-tree'><ul><li id='1'>Test1</li><li id='2'>Test2</li></ul></div>");

    $("#filter-value-tree").find("ul").append(result);

    $("#filter-value-tree").jstree({
        'core' : {
            'check_callback': true,
            'multiple': true
        },
        "plugins" : [ "changed" ]
    });
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jstree/3.2.1/jstree.min.js"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/jstree/3.2.1/themes/default/style.min.css" />

<button type="button" id="testBtn">Test</button>

<div id="testDiv"></div>

要结束它,还有更多信息,我正在从我的mysql数据库的php页面加载带有AJAX的jstree的内容。 ajax调用设置为async:false,只是有些人想知道它是否可以。加载按预期工作,我只是想说节点是被选中的,但是在一段时间后才被取消选择(如果我从jquery-2.1.1.js那一步调试该行,那么最后一件事就是调试器完成。)

我希望你能提前帮助我。

1 个答案:

答案 0 :(得分:1)

您遇到的问题与同步/异步代码有关:

在此代码中:

loadTree(getValueTree);
$("#filter-value-tree").jstree("select_node", "#2"); 

...在调用 getValueTree之前执行的最后一个语句。这是因为loadTree将执行Ajax调用,但会立即返回而不调用回调。仅当响应将通过异步事件进入时才会调用回调。在当前代码完成运行之前永远不会处理此事件(即清空了调用堆栈)。只有这样才能处理队列中的事件。

要解决此问题,请将该语句移动到回调部分,例如,如下所示:

loadTree(function () {
    getValueTree();
    $("#filter-value-tree").jstree("select_node", "#2"); 
});