我在网络应用项目中使用了一个延迟加载树;但是,我遇到了一些奇怪的行为。看起来只有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)中的样子:
答案 0 :(得分:1)
最后我找到了解决这个问题的方法,感谢这篇关于dojo兴趣的帖子:thisisalink。
基本上,使用dojo 1.6,dijit.tree.ForestStoreModel扩展了一些新的类钩子函数(我猜是因为TreeGrid完成的工作)。其中之一,onSetItem
在树节点展开后调用(因此在使用lazyLoading存储时将形成preLoaded到完全加载)。在基本实现中,此函数调用_requeryTop()
,它会重新查询所有根项。
对于我们的应用,我们只需将dijit.tree.ForestStoreModel
替换为我们的实施digicult.dijit.tree.ForestStoreModel
,其中onSetItem
和onNewItem
不会调用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()
完整的逻辑,只是添加了使用这种技术创建树节点的并行化:
希望它有所帮助,如果需要,我可以发布我的解决方法的源代码