首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >.property()做了什么?在function(){}.property()

.property()做了什么?在function(){}.property()
EN

Stack Overflow用户
提问于 2013-09-04 13:15:51
回答 2查看 6K关注 0票数 22
代码语言:javascript
复制
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/

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-09-04 22:08:08

在javascript中,获取或设置一个属性时执行某些处理的唯一方法是使用Object.defineProperty

代码语言:javascript
复制
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

  • Doesn't或

  • 发生变化,当person未定义时,依赖属性surname不是依赖的fullname,使错误成为依赖,触发观察者是可能的,不需要额外的代码并知道依赖层次:

  • 依赖于firstname,它可以是其他属性的依赖arghhh!<surname>H217fullname><代码>F218person.name >

由于这一点,Ember有了“属性”的概念,称为computed property

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

代码语言:javascript
复制
foo: Ember.computed(function({
  ...
}).property(dependent keys);

或者在使用(缺省) Ember.ENV.EXTEND_PROTOTYPES = true

代码语言:javascript
复制
foo: function() {
  ...
}.property(dependent keys);

之所以需要property(dependent keys),是因为它告诉ember什么是属性,这些属性在更改时会使属性更新。

代码语言:javascript
复制
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'),将返回一个缓存值,从而保存处理。在访问null对象时,您可以使用.property(..).volatile()
  • Avoid null或undefined errors禁用此功能,例如:如果未定义人或狗,则controller.get('person.dog.name')返回undefined

我希望它能帮上忙

票数 21
EN

Stack Overflow用户

发布于 2013-09-04 21:36:30

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

作为参数传递的字段和路径是依赖键。默认情况下,Ember中的所有计算属性都被缓存。要知道何时需要重新计算计算属性,Ember需要知道它依赖于哪些属性和路径。在本指南的示例中,Ember的计算属性依赖于firstNamelastNamefullName需要知道这一点,以便在这两个值发生变化时重新计算fullName。(注意:您可以使用.property().volatile()关闭缓存。)

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

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18605866

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档