为什么ember计算属性只在ember检查器中执行一次?

时间:2016-03-12 02:51:20

标签: ember.js computed-properties

我有一个演示控制器:

import Ember from 'ember';

export default Ember.Controller.extend({
  firstName: 'Bob',
  lastName: 'Smith',

  emailAddress: 'bobsmith@gmail.com',

  fullName: Ember.computed('firstName', 'lastName', function() {
    console.log('executed!');
    return `${this.get('firstName')} ${this.get('lastName')}`;
  }),

  actualEmailAddress: Ember.computed('emailAddress', function() {
    console.log('actualEmailAddress function is called: ', this.get('emailAddress'));
  })
});

当我在浏览器中的localhost上运行应用程序时,我打开ember检查器并运行:

$E.get('actualEmailAddress')

返回:

actualEmailAddress function is called: bobsmith@gmail.com

但是,当我第二次运行它时,我得到undefined

当我运行$E.get('fullName')

时也是如此

返回

executed!
"Bob Smith"

但是当我再次运行它时它只返回Bob Smith,而不是console.log

为什么会这样?

谢谢!

3 个答案:

答案 0 :(得分:4)

计算属性仅按需计算,即如果在{{actualEmailAddress}}模板中使用或在js代码中用作this.get('actualEmailAddress');

对于性能计算属性,只有在其依赖属性值更改时才会重新计算。因此,在第一次计算之后,结果将被缓存,如果您再次尝试访问CP,它将只返回缓存的值。

actualEmailAddress的第一种情况下,CP函数第一次执行并且您已记录您的语句,但您没有返回值,因此隐式返回undefined。因此,下次调用CP时,将返回缓存的值undefined

fullName的第二种情况下,该函数再次仅在第一次调用时记录该语句。在这里,由于您已正确返回值,因此下次尝试调用CP时,您将获得缓存的返回值作为响应。

要强制CP重新计算,您需要更改依赖属性的值。或者使用一个简单的方法并调用它。

答案 1 :(得分:1)

计算属性是 lazy 缓存。每次运行时,它们都会缓存返回的值,并且不会重新计算它,除非其中一个依赖属性发生更改,并且再次访问CP。

这是设计的。此外,您所看到的内容并未与Ember Inspector隔离 - 这适用于所有环境。

有关详细信息,请参阅我的answer to your other question

答案 2 :(得分:0)

  

计算属性使用对象转换对象文字   将访问者功能转化为财产。

     

默认情况下,支持计算属性的函数只会是   称为一次,结果将被缓存。您可以指定各种   计算属性所依赖的属性。这将迫使   如果依赖项被修改,则重新计算缓存的结果。

我建议使用:

yourProperty: function() 
              { 
                 //do something before send it back, example:
                 return `${this.get('yourRealProperty')}`;
              }.property('yourRealProperty'),

当您调用yourProperty时,这将返回yourRealProperty的值。

reference 1 reference 1