2015-02-05 39 views
1

我始終認爲.observes('someProperty').property('someProperty')的工作原理完全相同,只是前者用於觸發函數調用,後者用於保持對象屬性爲最新。計算vs觀察Ember中的控制器

但現在我遇到了問題。我的控制器代碼如下所示:

_logChange: function(){ 
    console.log('model array observer fired'); 
}.observes('[email protected]'), 

statsData: function(){ 
    console.log('statsData being updated'); 
    ... 
    return someArray; 
}.property('[email protected]') 

觀察員和計算性能都手錶的型號@每個但出於某種原因,在每一個模型變化觀測火災和財產只更新兩次,然後神祕地會耗盡。statsData在初始頁面加載時計算一次,並且在第一次路徑轉換時計算一次,然後在這之後,沒有任何轉換(其基礎model中的更改)會影響轉換。

這是怎麼回事?他們不應該以同樣的方式迴應變化嗎?

請注意,我的上午使用我的模板中的statsData屬性。

回答

2

2009年,由於灰燼IRC可愛的人,我能弄明白。問題是,我經過statsData一個組件,就像這樣:{{common-statistics values=statsData}}和分量,我有這個功能:

_validateValues: function(){ 
    var values = this.get('values'); 
    if(!values || !Ember.isArray(values) || values.length === 0) 
    { 
     this.set('values',[]); 
    } 
}.on('willInsertElement') 

是,你可以看到,設置values如果不是的成分是什麼期待。不幸的是,這也影響了控制器上的statsData,這要歸功於this JavaScript language feature。通過在組件中設置statsData,我打破了控制器上的計算屬性。

所以它從來都不是Ember的問題。我只是沒有意識到Ember對象上的對象屬性的行爲方式與他們在「常規JavaScript對象」上的行爲相同。

+0

我想補充一點,我沒有在'values'的計算屬性中定義的setter邏輯,這就是爲什麼計算的屬性被打破;它被香草JS陣列完全覆蓋。記得,在計算屬性中設置邏輯! – IGNIS 2015-02-19 16:14:41

1

觀察員立即開火,計算的火作爲運行循環的一部分,並計劃以去抖動的方式。目前您所看到的只是您向集合中添加或刪除項目,而不是集合中某個項目的屬性是否已更改。如果你想觀看一個特定的屬性,你需要指定它。

statsData: function(){ 
    console.log('statsData being updated'); 
    ... 
    return someArray; 
}.property('[email protected]') 

,如果你只是想觀看集合改變你應該只使用[]

statsData: function(){ 
    console.log('statsData being updated'); 
    ... 
    return someArray; 
}.property('model.[]') 
+0

感謝您的回答,我不知道關於觀察員立即發射與計算器在運行循環中發射的情況。我也不知道@each和[]之間的真正區別。好的信息!不過,我確實發現了自己的問題,但事實證明,這根本不是Ember問題。我發佈了一個答案。 – IGNIS 2015-02-05 16:26:09