我有一个击倒应用程序,有数百个可计算的观察值。如果我关闭了延迟更新,更新会很慢,但可以管理(在我的计算机上为+1秒)。但是,如果我打开延迟更新,这将变为68秒,在此期间chrome没有响应。
起初,我认为页面被困在无限循环中,因为当我暂停脚本执行时,堆栈跟踪一直在重复。这个片段被重复了几十次:
self._limitChange (knockout-3.5.0.debug.js:1452)
_evalDelayed (knockout-3.5.0.debug.js:2376)
markDirty (knockout-3.5.0.debug.js:2177)
notifySubscribers (knockout-3.5.0.debug.js:1398)
limitNotifySubscribers (knockout-3.5.0.debug.js:1353)
(anonymous) (knockout-3.5.0.debug.js:1254)
self._limitChange (knockout-3.5.0.debug.js:1452)`
最后我发现每一个stackframe的_limitChange都有一个不同的可计算的可观察到的。似乎knockout递归地遍历了整个可计算的可观察树。
我的问题如下:
-
为什么使用ko.options.deferUpdates=true时速度太慢,而没有它,ko还需要重新计算整个树?
-
还有谁有这个问题的经验吗?你是怎么解决的?
-
为什么ko需要遍历整棵树来调用markDirty?
任何见解都是非常感谢的。