【问题标题】:Ember.js: Collapsing/deferring expensive observers or computed propertiesEmber.js:折叠/推迟昂贵的观察者或计算属性
【发布时间】:2012-10-26 05:59:59
【问题描述】:

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

topContributor: (function() {
  // ... loop over articles (hence slow) ...
}).property('articles.@each.author')

更新articles数组,例如通过ember-data,重复触发属性函数共articles.length次。

当所有更改都已完成并且 runloop 被刷新时,有没有办法将更新折叠成一个惰性更新?

【问题讨论】:

    标签: ember.js


    【解决方案1】:

    感谢@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('articles.@each.author')
    

    【讨论】:

    • updateTopContributor会被runloop调用一次,但我不明白,它是如何匹配更改的结尾的?我想articles 数组更新需要不止一个运行循环,对吗?所以updateTopContributor 将被多次调用......我可能在这里错过了一些东西,但我真的很了解这里的流程。你能给我解释一下吗?
    • 当事件处理完成时,运行循环结束。因此,如果 Ajax 响应进入数据存储区,那么它会执行 update-update-update(反复触发观察者),最后,在返回浏览器之前,它会刷新 runloop。从概念上讲,所有这些都类似于使用setTimeout(..., 1) 推迟通话。您可以在Ember.run referencethis blog post 中找到更多信息。
    • 好的,所以如果我理解,流程是 runLoop1 开始 -> ajax 响应 -> 计划 updateTopContributor -> ajax 响应结束 -> runLoop1 结束 -> runLoop1 刷新 -> runLoop2 开始 -> updateTopContributor 触发-> runLoop2 结束。第一个 runloop 正在运行,而 ajax 调用尚未返回?
    猜你喜欢
    • 2011-11-01
    • 2015-03-30
    • 2015-05-11
    • 2016-12-30
    • 2015-04-28
    • 2016-04-22
    • 1970-01-01
    • 2013-10-21
    • 1970-01-01
    相关资源
    最近更新 更多