Ember.js:崩溃/延迟昂贵的观察者或计算属性

Ember.js:崩溃/延迟昂贵的观察者或计算属性,ember.js,Ember.js,在Ember应用程序中,假设您有一个观察者或一个属性可以观察数组,如下所示: topContributor: (function() { // ... loop over articles (hence slow) ... }).property('articles.@each.author') 例如,通过ember数据更新articles数组,会重复触发属性函数,总共触发articles.length次 当所有更改完成并刷新运行循环时,是否有办法将更新折叠为一个延迟更新?感谢@wagne

在Ember应用程序中,假设您有一个观察者或一个属性可以观察数组,如下所示:

topContributor: (function() {
  // ... loop over articles (hence slow) ...
}).property('articles.@each.author')
例如,通过ember数据更新
articles
数组,会重复触发属性函数,总共触发
articles.length


当所有更改完成并刷新运行循环时,是否有办法将更新折叠为一个延迟更新?

感谢@wagnet和@kriselden的以下提示:

此时,当绑定被延迟(延迟)时,观察者和扩展计算的属性会立即触发。在未来,他们将继续努力

同时,您可以作为一种变通方法来安排延迟函数调用,该调用将只运行一次。我认为,计算属性可以很容易地转化为观察者,以遵循相同的模式。以下是一个例子:

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

_updateTopContributorObserver: (function() {
  Ember.run.once(this, 'updateTopContributor');
}).observes('articles.@each.author')

runloop将调用一次
updateTopContributor
,但我不明白的是,它如何匹配更改的结束?我想
articles
数组更新需要不止一个runloop,对吗?因此,
updateTopContributor
将被多次调用。。。我可能错过了一些东西,但我会真正理解这里的流程。你能解释一下吗?当事件处理完成时,运行循环就结束了。因此,如果数据存储中出现Ajax响应,那么它将进行更新(反复触发观察者),最后,在返回浏览器之前,它将刷新runloop。从概念上讲,所有这些都类似于使用
setTimeout(…,1)
延迟调用。您可能会在和中找到更多信息。好的,如果我理解的话,那么流程是runLoop1启动->ajax响应->计划updateTopContributor->ajax响应结束->runLoop1结束->runLoop1刷新->runLoop2启动->updateTopContributor触发->runLoop2结束。第一个runloop正在运行,而ajax调用尚未返回?