Dojox的JsonRestStore多次加载相同的东西

时间:2011-08-31 13:39:45

标签: javascript dojo

我在网络应用项目中使用了一个延迟加载树;但是,我遇到了一些奇怪的行为。看起来只有3个级别的简单树会导致7个根结构请求。在查看官方的JRS树测试后,我不确定这是否正常。

看一下这个例子: http://download.dojotoolkit.org/release-1.6.1/dojo-release-1.6.1/dijit/tests/tree/Tree_with_JRS.html

当我访问它时,我的浏览器会对根结构发出5个请求。我唯一的问题是为什么?

编辑:值得一提的是dojo 1.5或更低版本不会发生这种情况。

这是检查器(Chrome)中的样子: Chrome Inspector

2 个答案:

答案 0 :(得分:1)

最后我找到了解决这个问题的方法,感谢这篇关于dojo兴趣的帖子:thisisalink

基本上,使用dojo 1.6,dijit.tree.ForestStoreModel扩展了一些新的类钩子函数(我猜是因为TreeGrid完成的工作)。其中之一,onSetItem在树节点展开后调用(因此在使用lazyLoading存储时将形成preLoaded到完全加载)。在基本实现中,此函数调用_requeryTop(),它会重新查询所有根项。

对于我们的应用,我们只需将dijit.tree.ForestStoreModel替换为我们的实施digicult.dijit.tree.ForestStoreModel,其中onSetItemonNewItem不会调用this._requeryTop

遗憾的是,继承ForestStoreModel是不够的,因为函数中的this.inherited(arguments);调用无法轻易替换,所以我们不得不复制整个类(复制类,重命名,注释掉两行) - 很长一段时间内最容易修复:-)) - 一旦我们将dojo更新为更新版本,这可能会迫使我们重新设计类。

答案 1 :(得分:0)

当有一个10000多个节点的树一次全部加载时,我也遇到了dijit Tree的性能问题,在最顶层有~3000个项目。 该树只有一个虚拟根节点,它通过ajax调用在第一次点击时加载整个树。

在这种情况下,树创建需要超过1分钟才能加载,我在IE8上弹出了“停止运行此脚本”对话框。

在应用了一些优化步骤后,现在所有主流浏览器(包括IE8-IE11)都会在2秒内加载树。

我做的第一个优化是使用dijit/tree/ObjectStoreModel作为树的模型,使用dojo/store/Memory作为数据存储。

这加快了将ajax响应json节点插入到树的数据存储中。

第二个优化涉及树节点的缓慢创建。这需要更多的努力来解决:

我必须扩展dijit/Tree并覆盖setChildItems()函数(调用_createTreeNode()函数的部分)。

我保持setChildItems()完整的逻辑,只是添加了使用这种技术创建树节点的并行化:

http://www.picnet.com.au/blogs/Guido/post/2010/03/04/How-to-prevent-Stop-running-this-script-message-in-browsers.aspx

希望它有所帮助,如果需要,我可以发布我的解决方法的源代码