根据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");
Run Code Online (Sandbox Code Playgroud)
在上面的示例中,this.get('name')用于访问属性name,但是方法say被定义为类的属性,App.Person并且可以通过点表示法直接访问.虽然方法和属性之间存在明显的用法差异,但在JavaScript中,两者的实现没有区别.如果我替换this.get('name'),该示例仍然有效this.name.
我绝对想坚持这里的最佳实践,每次都使用getter/setter,但我想了解Ember.js的内部:)
get.用户与您的应用程序的交互是导致对象属性发生变化的原因,我们处理与事件的交互.当触发Ember中的事件时,它不会立即解决,而是将其置于优先级队列中并在以后解决.
属性以异步形式更新和读取,如果您直接使用它们this,则无法保证您将获得最新的值.
检查:管理异步
当您对Ember中的属性进行更改时,它不会立即传播该更改.相反,它会立即使任何依赖属性无效,但会将实际更改排入队列.
因此,当您更改属性的值时,大致会发生以下情况:
this照常工作)想象一下,您使用this读取属性,但发生一些其他更改其值的事件.在刷新队列之前,新值将不可用,但this会立即读取属性并返回计划很快更新的属性的值.你得到陈旧的数据.方法get并set为您管理此异步并始终保证新值.
当您只有一个属性时,在整个应用程序中,将不会注意到此异步机制.
Ember中有许多不同的队列,所有这些背后的基本机制是运行循环.
| 归档时间: |
|
| 查看次数: |
1842 次 |
| 最近记录: |