我想知道Ember.Objects的创建方式是否有变化.考虑下面的代码,我不希望FULL_NAME,因为我没有使用"获得()"属性访问返回"张三",但最近发现这个工作并没有返回'张三’.什么时候使用简单的点符号是安全的,什么时候应该使用".get('property')"?
注意 - 这段代码适用于ember 1.7
var Person = Ember.Object.extend({
first_name: '',
last_name: '',
full_name: function() {
return this.first_name + ' ' + this.last_name;
}.property()
});
var joe = Person.create({first_name: 'Joe', last_name: 'Smith'});
console.log(joe.get('full_name'));
Run Code Online (Sandbox Code Playgroud)
事实上,自从前任者获得/设置物品以来,该物品一直有效.它伤害你的地方是你获得的财产是一个计算财产或代理财产,或者你正在设置它并被观察(通过任何东西,包括dom).
计算属性存储在对象的元数据中,需要进行评估才能提供值.
var Person = Ember.Object.extend({
first_name: '',
last_name: '',
full_name: function() {
return this.first_name + ' ' + this.last_name;
}.property('first_name', 'last_name')
});
var joe = Person.create({first_name: 'Joe', last_name: 'Smith'});
console.log(joe.full_name); // undefined
Run Code Online (Sandbox Code Playgroud)
示例:http://emberjs.jsbin.com/kaxil/edit?html,css,js,console,output
这在控制器和余烬数据中非常明显.调用get/set on ObjectController
会尝试在模型上获取/设置属性,而不是模仿装饰器模式.与Ember Data类似,其代理获取/设置属性的可能位置链(脏,传输,提交数据).
var Person = Ember.Object.extend({
first_name: '',
last_name: '',
full_name: function() {
return this.first_name + ' ' + this.last_name;
}.property('first_name', 'last_name')
});
var joe = Person.create({first_name: 'Joe', last_name: 'Smith'});
var c = Ember.ObjectController.create({
model: joe
});
console.log(c.first_name); // undefined
console.log(c.get('first_name')); // Joe
Run Code Online (Sandbox Code Playgroud)
示例:http://emberjs.jsbin.com/bebavi/edit?html,css,js,console,output
所以,话虽这么说,如果你知道一个属性存在于对象上并且它没有被代理到另一个对象,那么仅仅obj.property
用于获取是没有害处的.现在,如果您要更改该属性,obj.property = 'foo';
那么可能会造成更多伤害.由于Ember使用通过使用.set(...)
您触发的观察者模式,因此存在更改依赖属性的风险,该属性不会通知依赖属性它已更改.
var Person = Ember.Object.extend({
first_name: '',
last_name: '',
full_name: function() {
return this.first_name + ' ' + this.last_name;
}.property('first_name', 'last_name')
});
var joe = Person.create({first_name: 'Joe', last_name: 'Smith'});
console.log(joe.get('full_name'));
joe.first_name = 'foo';
console.log("should be foo smith:" + joe.get('full_name')); // should be foo Smith
joe.set('first_name','asdf');
console.log(joe.get('full_name'));
Run Code Online (Sandbox Code Playgroud)
示例集未更新:http://emberjs.jsbin.com/cagufe/edit
你总是会更安全地总是使用吸气剂/安装者,尽管我知道在我知道我不需要使用吸气剂的少数情况下是懒惰的.