根据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
,则该示例仍然有效。
我绝对想在这里坚持最佳实践,即每次使用getter / setter,但我想了解Ember.js的内部:)
答案 0 :(得分:9)
get
访问属性。用户与您的应用互动是导致对象属性发生变化的原因,我们会处理与事件的互动。当Ember中的事件被触发时,它不会立即被解决,而是被放入优先级队列并在以后解决。
属性会以异步形式更新和阅读,如果您使用this
直接访问它们,则无法保证您获得最新的值。
当您对Ember中的属性进行更改时,它不会立即传播该更改。相反,它会立即使任何依赖属性无效,但会将实际更改排队等等。
因此,当您更改属性的值时,大致会发生这种情况:
this
将照常工作)想象一下,您使用this
来读取属性,但会发生一些其他更改其值的事件。在刷新队列之前,新值将无法使用,但this
会立即读取属性并返回计划很快更新的属性的值。你得到陈旧的数据。方法get
和set
为您管理此异步并始终保证新值。
当你只有一个属性时,在整个应用程序中,这个异步机制不会被注意到。
Ember中有许多不同的队列,所有这些背后的基本机制是the run loop。