Ember对象属性访问

时间:2014-10-22 14:56:30

标签: ember.js

我想知道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'));

1 个答案:

答案 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

你总是会更安全地总是使用吸气剂/安装者,但我知道在我知道我不需要使用吸气剂的少数情况下我很懒。