Todos.TodoController = Ember.ObjectController.extend({
isCompleted: function(key, value){
var model = this.get('model');
if (value === undefined) {
// property being used as a getter
return model.get('isCompleted');
} else {
// property being used as a setter
model.set('isCompleted', value);
model.save();
return value;
}
}.property('model.isCompleted')
});
我正在阅读Ember.js的ToDo指南,但我似乎无法理解这个控制器是如何工作的。.property()是什么意思?为什么当我删除'return value;‘行时,功能保持不变。如果有人能解释清楚这里到底发生了什么,那就太好了。
指南链接:http://emberjs.com/guides/getting-started/marking-a-model-as-complete-incomplete/
发布于 2013-09-04 22:08:08
在javascript中,获取或设置一个属性时执行某些处理的唯一方法是使用Object.defineProperty
Object.defineProperty(person, "b", {
get : function() {
return person.firstName + ' ' + person.surname;
},
set : function(newValue) {
var names = newValue.split(' ');
person.firsname = names[0];
person.surname = names[1];
},
enumerable : true,
configurable : true
});
但这也有一些缺点:
依赖属性不是交叉绑定的,换句话说,如果依赖属性browser
person
未定义时,依赖属性surname
不是依赖的fullname
,使错误成为依赖,触发观察者是可能的,不需要额外的代码并知道依赖层次:
firstname
,它可以是其他属性的依赖arghhh!<surname
>H217fullname><代码>F218person.name >由于这一点,Ember有了“属性”的概念,称为computed property。
它可以通过两种方式声明:
foo: Ember.computed(function({
...
}).property(dependent keys);
或者在使用(缺省) Ember.ENV.EXTEND_PROTOTYPES = true
时
foo: function() {
...
}.property(dependent keys);
之所以需要property(dependent keys)
,是因为它告诉ember什么是属性,这些属性在更改时会使属性更新。
fullname: function(key, value) {
// setter
if (value !== undefined) {
var names = value.split(' ');
this.set('firstname', names[0]);
this.set('surname', names[1]);
}
// always return the complete result, so nexts calls to this.get('fullname') will return the cached value
return this.get('firstname') + ' ' + this.get('surname');
}.property('firstname', 'surname')
使用此功能,您可以获得以下优势:
firstname
或surname
更改为新值时,fullname
也会更改。beforeObserves
是在更改值之前触发的,而observes
是在值更改之后触发的。.property(..).volatile()
controller.get('person.dog.name')
返回undefined
。我希望它能帮上忙
发布于 2013-09-04 21:36:30
.property()
将函数标记为计算属性,以便可以在模板中使用,例如,以一致的方式使用。它是一个JavaScript属性foo
吗?或者它是一个函数foo()
?计算属性解决了所有平台上的这个问题。
作为参数传递的字段和路径是依赖键。默认情况下,Ember中的所有计算属性都被缓存。要知道何时需要重新计算计算属性,Ember需要知道它依赖于哪些属性和路径。在本指南的示例中,Ember的计算属性依赖于firstName
和lastName
;fullName
需要知道这一点,以便在这两个值发生变化时重新计算fullName
。(注意:您可以使用.property().volatile()
关闭缓存。)
请阅读指南。所有这些都记录在那里。
https://stackoverflow.com/questions/18605866
复制相似问题