提问者:小点点

. properties()做什么?在函数(){}.properties()中


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指南,但我似乎不明白这个控制器是如何工作的。属性()是什么意思?为什么当我删除“返回值;”行时,功能保持不变。如果有人能准确解释这里发生了什么,那就太好了。

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


共2个答案

匿名用户

在javascript中,在获取或设置一个属性时进行一些处理的唯一方法是使用Object.定义属性:

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

但这有一些缺点:

  • 不是跨浏览器
  • 没有绑定,换句话说,如果firstnamesurname更改,则依赖属性fullname不会更改。
  • 调用person.name未定义时,抛出错误
  • 不可能触发观察者,没有额外的代码和依赖层次结构:firstname依赖于fullname,它可以是其他属性的依赖arghhh!

因此,Ember有“属性”的概念,称为计算属性。

它可以通过两种方式声明:

foo: Ember.computed(function({
  ...
}).property(dependent keys);

或者使用(默认)Ember. ENV.EXTEND_PROTOTYPES=true时:

foo: function() {
  ...
}.property(dependent keys);

需要属性(依赖键),因为它告诉记忆什么是属性,当更改时,将使属性更新。

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会更改。
  • 在改变值之前触发beforeOb的,在改变值之后触发
  • 任何引用某些属性的模板都会更新
  • 不止一次对人. get('firstname')的调用,将返回一个缓存值,从而节省处理时间。您可以使用禁用它。属性(…)。易失性()
  • 避免空或未定义的错误,当访问空对象时,如:控制器. get('person.dog.name')返回未定义,如果人或狗是未定义的。

我希望有帮助

匿名用户

. properties()将函数标记为计算属性,以便它可以在模板中使用,例如,以一致的方式。它是JavaScript属性foo?还是函数foo()?计算属性在所有平台上都解决了这个问题。

作为参数传递的字段和路径是依赖键。Ember中的所有计算属性默认都被缓存。要知道何时需要重新计算计算属性,Ember需要知道它依赖于哪些属性和路径。在指南的示例中,fullName计算属性依赖于firstNamelastName;Ember需要知道这一点,以便在其中任何一个更改时重新计算fullName。(注意:您可以使用. properties().易失性()关闭缓存。)

请阅读指南。所有这些都记录在那里。