gpt4 book ai didi

javascript - .property() 的作用是什么?在函数(){}.property()中

转载 作者:行者123 更新时间:2023-12-02 22:55:47 25 4
gpt4 key购买 nike

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 指南,但我似乎无法理解这个 Controller 是如何工作的。 .property() 是什么意思?当我删除“返回值”时,为什么会这样?线功能保持不变。如果有人能准确解释这里发生的事情那就太好了。

指南链接:http://emberjs.com/guides/getting-started/marking-a-model-as-complete-incomplete/

最佳答案

在 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
});

但这有一些缺点:

  • 不是跨浏览器
  • 没有绑定(bind),换句话说,如果 firstnamesurname更改,依赖属性 fullname没有改变。
  • 调用 person.nameperson未定义,抛出错误
  • 如果没有额外的代码并且了解依赖层次结构,就不可能触发观察者:firstname取决于fullname ,并且它可以依赖于其他属性啊啊啊!

因此Ember有了“属性(property)”的概念,称为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')

使用它,您可以获得以下优势:

  • 更改时firstnamesurname为新值 fullname被改变了。
  • beforeObserves在更改值之前触发,并且 observes值更改后触发。
  • 任何引用某些属性的模板都会更新
  • 多次调用 person.get('firstname') 将返回缓存值,从而节省处理时间。您可以使用 .property(..).volatile() 禁用此功能
  • 访问 null 对象时,避免出现 null 或未定义错误,例如: controller.get('person.dog.name')返回undefined ,如果人或狗未定义。

希望对你有帮助

关于javascript - .property() 的作用是什么?在函数(){}.property()中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18605866/

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