2012-09-17 62 views
7

在灰烬应用,假定有一个观察者或者手表的阵列,像这样的属性:Ember.js:折叠/推迟昂贵观察员或计算属性

topContributor: (function() { 
    // ... loop over articles (hence slow) ... 
}).property('[email protected]') 

更新articles阵列,通过余烬例如,数据重复触发属性函数总共articles.length次。

当所有更改结束并且刷新runloop时,是否有办法将更新合并为一个惰性更新?

回答

10

感谢@wagenet和@krisselden以下指针:

目前,虽然绑定被推迟(懒惰),观察员和扩展计算性能立即触发。在将来,他们might become deferred as well

与此同时,您可以使用Ember.run.once作为解决方案来安排延迟函数调用,该调用将仅运行一次。我猜想,计算属性可以很容易地转化为观察者,以遵循相同的模式。下面是一个例子:

updateTopContributor: function() { 
    // ... loop over articles (hence slow) ... 
    this.set('topContributor', ...); 
}, 

_updateTopContributorObserver: (function() { 
    Ember.run.once(this, 'updateTopContributor'); 
}).observes('[email protected]') 
+0

'updateTopContributor'将被runloop调用一次,但我不明白,它是如何匹配更改结束?我猜想'articles'数组更新需要多个runloop吗?所以'updateTopContributor'会被多次调用......我可能会错过这里的东西,但我真的很了解这里的流程。你能解释我吗? –

+0

当事件处理完成时,runloop的结束会发生。因此,如果数据存储的Ajax响应进入,则它会进行update-update-update(重复触发观察器),最后在返回到浏览器之前,它将刷新runloop。从概念上讲,所有这些与使用'setTimeout(...,1)'推迟调用相似。您可以在[Ember.run参考](http://emberjs.com/api/classes/Ember.run.html)和[此博客文章]中找到更多信息(http://www.thesoftwaresimpleton.com/blog/2012/04/03 /测试 - 灰烬和最runloop /)。 –

+0

好吧,所以如果我明白了,流程是runLoop1开始 - > ajax响应 - > schedule updateTopContributor - > ajax响应结束 - > runLoop1结束 - > runLoop1刷新 - > runLoop2开始 - > updateTopContributor触发 - > runLoop2结束。第一个runloop正在运行,而ajax调用还没有返回? –