【问题标题】:When to use getters/setters and when to safely omit them?何时使用 getter/setter 以及何时安全地省略它们?
【发布时间】:2014-07-04 02:34:21
【问题描述】:

根据http://emberjs.com/guides/object-model/classes-and-instances/,需要使用getter 和setter 访问属性:

访问对象的属性时,请使用 get 和 set 访问器方法。

确保使用这些访问器方法;否则,计算属性不会重新计算,观察者不会触发,模板也不会更新。

我知道在更改属性时需要使用 setter 来让 Ember 知道更改,以便它可以更新绑定,但是读取属性呢?

来自http://emberjs.com/guides/object-model/classes-and-instances/的示例

App.Person = Ember.Object.extend({
  say: function(thing) {
    var name = this.get('name');
    alert(name + " says: " + thing);
  }
});

var yehuda = App.Person.create({
  name: "Yehuda Katz"
});

yehuda.say("Yes");

在上面的示例中,this.get('name') 用于访问属性 name,但是方法 say 被定义为类 App.Person 的属性,并且可以通过点符号直接访问。虽然方法和属性之间存在明显的用法差异,但在 JavaScript 中,两者的实现没有区别。如果我将this.get('name') 替换为this.name,该示例仍然有效。

  1. Ember 在对象的方法和属性方面是否存在任何实现差异?
  2. 直接访问方法总是安全的吗?
  3. 是否必须始终由 getter 访问所有属性(包括计算属性)?如果没有,什么时候可以安全地直接访问属性?

我绝对想在这里坚持最佳实践,即每次都使用 getter/setter,但我想了解 Ember.js 的内部结构:)

【问题讨论】:

    标签: ember.js


    【解决方案1】:
    1. Ember 中方法或属性的定义与 Vanilla JavaScript 中的相同,但在 Ember 中的解析方式不同。您没有使用 POJO。每次从 Route/Controller/View 扩展时,您都在添加处理不同方法和属性的 Ember 层。
    2. 不,并不总是安全的。在您的情况下,这是因为它过于简单。
    3. 是的,始终使用get 访问属性。

    用户与您的应用程序的交互是导致对象属性发生变化的原因,我们处理这些与事件的交互。当 Ember 中的事件被触发时,它不会立即解决,而是放入优先级队列并在稍后解决。

    属性以异步形式更新和读取,如果您直接使用 this 访问它们,则无法保证您将获得最新的值。

    检查:Managing Asynchrony

    当您在 Ember 中对属性进行更改时,它不会立即传播该更改。相反,它会立即使任何依赖属性无效,但会将实际更改排队等待稍后发生。

    所以,当你改变一个属性的值时,大致是这样的:

    1. 属性已更改
    2. 所有依赖属性均无效
    3. 将实际更改排队以备后用
    4. 等待当前用户的任何其他事件处理程序完成
    5. 刷新更改队列
      • 到此为止,该属性实际上已更新(this 将照常工作)

    假设您使用this 读取属性,但发生了其他一些改变其值的事件。在刷新队列之前,新值将不可用,但this 会立即读取属性并返回计划很快更新的属性的值。你得到过时的数据。 getset 方法为您管理这种异步并始终保证新鲜值。

    当你只有一个属性时,在整个应用中,这种异步机制不会被注意到。

    Ember 中有很多不同的队列,而这一切背后的基本机制就是the run loop

    【讨论】:

    • 感谢您的全面回答,现在我明白我需要始终使用 get/set 方法访问属性。广告 2. 您能否澄清一下何时使用 this 访问方法是安全和不安全的?在任何情况下,getter 都需要访问方法吗?我认为这会导致this.get('methodA').call(this)
    • 行为在较新的 Ember 版本中发生了变化,您现在可以安全地使用 POJO getter,除了 ObjectProxy 属性:guides.emberjs.com/v3.9.0/object-model/classes-and-instances/…
    猜你喜欢
    • 2011-12-21
    • 1970-01-01
    • 1970-01-01
    • 2019-09-20
    • 2018-08-05
    • 1970-01-01
    • 2019-02-22
    相关资源
    最近更新 更多