0

我有一个演示控制器:

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

当我在浏览器的本地主机上运行应用程序时,我打开 ember 检查器并运行:

$E.get('actualEmailAddress')

这将返回:

actualEmailAddress function is called: bobsmith@gmail.com

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

我跑步的时候也是这样$E.get('fullName')

它返回

executed!
"Bob Smith"

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

为什么会这样?

谢谢!

4

3 回答 3

4

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

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

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

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

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

于 2016-03-12T12:38:16.907 回答
1

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

这是设计使然。此外,您所看到的并不是 Ember Inspector 所独有的——这适用于所有环境。

有关更多详细信息,请参阅我对您其他问题的回答。

于 2016-03-12T12:37:19.730 回答
0

计算属性将具有对象访问器函数的对象字面量转换为属性。

默认情况下,支持计算属性的函数只会被调用一次,结果将被缓存。您可以指定计算属性所依赖的各种属性。如果修改了依赖项,这将强制重新计算缓存的结果。

我建议使用:

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

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

参考 1 参考 1

于 2017-04-28T17:58:25.813 回答