我有一个演示控制器:
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
为什么会这样?
谢谢!
答案 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的值。