我想知道Ember.Objects的创建方式是否有变化。鉴于下面的代码,我不希望full_name返回" Joe Smith"因为我没有使用" .get()"属性访问者,但最近发现这工作并确实返回"乔史密斯"。什么时候使用简单的点符号是安全的,什么时候应该使用" .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'));
答案 0 :(得分:6)
实际上,从pre-ember开始,从对象中获取/设置属性是有效的。它伤害你的地方是你获得的财产是一个计算财产或代理财产,或者你正在设置它并被观察(通过任何东西,包括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
示例:http://emberjs.jsbin.com/kaxil/edit?html,css,js,console,output
这在控制器和余烬数据中非常明显。在ObjectController
上调用get / set将尝试在模型上获取/设置属性,而不是模仿装饰器模式。与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
示例: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'));
显示设置未更新的示例:http://emberjs.jsbin.com/cagufe/edit
你总是会更安全地总是使用吸气剂/安装者,但我知道在我知道我不需要使用吸气剂的少数情况下我很懒。