Ember对象属性访问

wil*_*dev 3 ember.js

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

Kin*_*n2k 6

事实上,自从前任者获得/设置物品以来,该物品一直有效.它伤害你的地方是你获得的财产是一个计算财产或代理财产,或者你正在设置它并被观察(通过任何东西,包括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

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