如何在dynatree上强制同步模式?

时间:2018-04-14 12:34:27

标签: ajax synchronous dynatree

我正在使用Martin Wendt的Dynatree,并想要动态地和递归地更新Ajax中的树。

为此,我使用List<Integer> intList = new ArrayList<>(Arrays.asList(1,2,5)); 之类的功能 和tree.getNodeByKey(nodes[i-1]).appendAjax({});循环中的tree.activateKey(nodes[i]);

for添加到循环中时,我的代码可以正常工作95%或时间。没有它,代码永远不会有效。

问题显然来自于 Dynatree正在异步模式下执行Ajax请求这一事实,并且在添加到alert("Hello world");时似乎忽略了async:false和/或.initAjax

.appendAjax

我尝试在 jQuery('#tree').dynatree("getTree").getNodeByKey(nodes[i-1]).appendAjax({ type: 'POST', url: "inc/treeNodes.php", dataType: 'json', data: {key: nodes[i]}, async:false }); 的调用周围添加setTimeout (function() {},2000);,但它阻止了此方法的运行。

是否可以修改Dynatree以支持异步模式?

1 个答案:

答案 0 :(得分:0)

虽然它没有真正回答在同步模式下运行Dynatree的问题,但我发现了一个解决方法几乎模拟了Ajax同步行为。

编辑:以下解决方法似乎在localhost上运行得相当好,但如果该站点是远程的则不行。

在重要调用Dynatree的方法之前,添加一个setTimeOut()调用,最后会将某些内容写入控制台。

   for (i=1; i < n; i++) {
        (...)
        setTimeout(function(){console.log('_')}, 3000);  
        jQuery('#tree').dynatree("getTree").getNodeByKey(nodes[i-1]).appendAjax({...});
        (...)
    }

setTimeout并不会像延迟所暗示的那样减慢代码速度。 例如,如果循环有三次迭代,则在完成所有三个appendAjax调用完成的工作之前,您不必等待9秒(3x3000)。 我假设在.appendAjax()仍在运行时执行了setTimeout次调用,但后者似乎对文档窗口产生了一些神奇的影响。

使用setTimeout和触发器console.log()与插入alert();次呼叫的效果相似,但对于访问者来说是“无声的”。