2016-03-12 21 views
0

我有一個演示控制器:爲什麼燼計算屬性只能在燼檢查器中執行一次?

import Ember from 'ember'; 

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

    emailAddress: '[email protected]', 

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

當我運行的應用程序在本地主機上的瀏覽器,我打開燼檢查並運行:

$E.get('actualEmailAddress')

這將返回:

actualEmailAddress function is called: [email protected]

但是當我第二次運行它時,我只是得到undefined

當我運行$E.get('fullName')

它返回

executed! 
"Bob Smith" 

但同樣的事情,那麼,當我再次運行它它只返回Bob Smith,而不是console.log

這究竟是爲什麼?

謝謝!

回答

3

計算屬性只能得到上計算,即如果在模板中使用像{{actualEmailAddress}}或js代碼作爲this.get('actualEmailAddress');

出於性能方面的計算性能,如果依賴於它的屬性值被改變只得到重新計算的需求。所以在第一次計算之後,結果將被緩存,如果您嘗試再次訪問CP,它將簡單地返回緩存的值。

actualEmailAddress的第一種情況下,CP函數首次執行,並且您記錄了語句,但沒有返回值,因此undefined將隱式返回。因此,下次您調用CP時,將返回緩存值undefined

fullName的第二種情況下,該函數僅在第一次被調用並且語句被記錄。因爲您已經正確地返回了一個值,所以下次嘗試調用CP時,會得到緩存的返回值作爲響應。

要強制CP重新計算,您需要更改從屬屬性的值。或者使用一個簡單的方法並調用它。

1

計算屬性是懶惰緩存。每次運行時,它們都會緩存返回的值,並且不會重新計算它,除非其中一個依賴屬性發生更改,並且再次訪問CP。

這是設計。另外,你所看到的並不是孤立的Ember Inspector--對於所有環境都是如此。

查看我的answer to your other question瞭解更多詳情。

0

計算屬性將對象的 訪問器函數轉換爲屬性。

默認情況下,支持計算屬性的函數只會是 ,稱爲,一旦,結果將被緩存。您可以指定您的計算屬性所依賴的各種屬性 。如果依賴關係被修改,這將強制重新計算緩存的結果 。

我建議使用:

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

這將返回yourRealProperty當你invoque yourProperty值。

reference 1 reference 1