【问题标题】:Ember Computed Property vs Ember ObserverEmber 计算属性与 Ember 观察者
【发布时间】:2016-08-08 12:06:39
【问题描述】:

我在这里看到的之前的问题似乎都没有涉及何时使用 Ember Computed Property 与 Ember Observer 的主题。我了解计算属性使用以前的属性来帮助生成新属性并在运行循环中更新。

Person = Ember.Object.extend({
  // these will be supplied by `create`
  firstName: null,
  lastName: null,

  fullName: Ember.computed('firstName', 'lastName', function() {
    return `${this.get('firstName')} ${this.get('lastName')}`;
  })
});

另一方面,观察者在运行循环之外进行更新,并且可以观察任何东西,甚至是计算属性。它会对任何类型的变化做出反应。

Person = Ember.Object.extend({
  // these will be supplied by `create`
  firstName: null,
  lastName: null,

  fullName: Ember.computed('firstName', 'lastName', function() {
    return `${this.get('firstName')} ${this.get('lastName')}`;
  }),

  fullNameChanged: Ember.observer('fullName', function() {
    // deal with the change
    console.log(`fullName changed to: ${this.get('fullName')}`);
  })
});

Ember 文档随后指出,观察者通常被过度使用。有人可以举一个更好的例子来说明正确使用观察者吗?他们还能看什么,不正确使用与正确使用的影响是什么?

源代码可以在 ember 文档中找到:https://guides.emberjs.com/v2.3.0/object-model/observers/

【问题讨论】:

    标签: ember.js


    【解决方案1】:

    Computed Property 使用以前的属性来帮助生成新属性并在运行循环中更新

    是的,但是懒惰地——意味着只有在被引用时,它们的依赖关系发生了变化,才会使缓存的值失效。

    Ember 文档随后指出,观察者通常被过度使用。

    是的,只要被监视的属性发生变化,观察者就会同步触发,即使原因是重新计算不会使用的东西。对应该计算的属性使用观察者是经典的 Ember 反模式之一。

    我检查了我处理过的几个大型应用程序,发现观察者被用于在某些事情发生变化时根据需要调用某些第三方库,或者在选择新的 UI 语言时更改应用程序的语言。

    【讨论】:

    • @toruzaburo “对应该计算的属性使用观察者是经典的 Ember 反模式之一。”。因此,一个滥用它的例子是观察者计算商店中的商品数量,而计算属性实际上可以做到这一点?
    猜你喜欢
    • 2015-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-15
    • 2016-04-15
    • 2023-03-21
    • 1970-01-01
    相关资源
    最近更新 更多