gpt4 book ai didi

ember.js - Ember 对象属性访问

转载 作者:行者123 更新时间:2023-12-02 21:40:32 25 4
gpt4 key购买 nike

我想知道 Ember.Objects 的创建方式是否发生了变化。鉴于下面的代码,我不希望 full_name 返回“Joe Smith”,因为我没有使用“.get()”属性访问器,但最近发现这有效并且确实返回“Joe Smith”。什么时候使用简单点表示法是安全的,什么时候应该使用“.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'));

最佳答案

实际上,从 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

代理属性

这在 Controller 和 ember 数据中非常明显。在 ObjectController 上调用 get/set 将尝试在模型上获取/设置属性,而不是模仿装饰器模式本身。与 Ember Data 类似,它代理获取/设置一系列可能的属性(property)位置(脏数据、传输中数据、已提交数据)。

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

通常使用 getter/setter 会更安全,尽管在我知道不需要使用 getter 的少数情况下我确实很懒。

关于ember.js - Ember 对象属性访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26510530/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com