我正在使用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以支持异步模式?
答案 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();
次呼叫的效果相似,但对于访问者来说是“无声的”。