2013-07-26 16 views
1

我無法讓我的ApplicationController觀察它的一個值。視圖正在調用控制器上的一個函數,該函數更改其selectedIds屬性。在控制器上的另一種方法觀察到這一點:控制器如何觀察自己的價值?

hi: function() { 
    console.log('hi'); 
}.observes('selectedIds') 

但只是被稱爲第一次。這是指定觀察者的正確方法嗎?

這裏是JSBin。打開控制檯並點擊鏈接,你會看到控制器屬性發生變化,但是hi只觸發一次。

回答

2

問題更多的是觀察Ember數組而不是觀察控制器自身的價值。

觀察員正在觀察屬性。所以當你只是把東西推入數組時,屬性(該數組)不會改變。

首先,你需要使用Ember的pushObject方法對待元素,如灰燼數組中的對象:

allIds.pushObject(id); // not allIds.push(id) 

然後觀察者應使用@each,而不是觀察陣列觀察陣列中的每個元素本身。

hi: function() { 
    console.log('hi'); 
}.observes('[email protected]') 

更新JSBin:http://jsbin.com/aqagij/2/edit

我希望幫助。

+0

笑你1分鐘打我!很好的回答.... –

+0

感謝你們兩位!一個後續...... Ember在我使用它的任何地方都知道「.pushObject」?例如,'this.get('controller.selectedIds')。pushObject(4)'? –

+0

另外:Ember改變原始的JavaScript數組? –

1

這裏的問題是,selectedIds是平原對象的普通數組。 Ember不知道一件物品已被添加。這兩個選項可以手動提醒您在執行任何添加或刪除操作後發生更改,或者讓Ember通過使用其數組對象自動'知道'。

或手動通知灰燼,只是觀察陣列作爲一個整體:

this.notifyPropertyChange('selectedIds') 
.observes('selectedIds') 

參見:http://emberjs.com/api/classes/Ember.Array.html

+0

上述兩個都打敗了我,只是爲了顯示手動觸發通用notifyPropertyChange的替代方案,以獲得完整性 – RyanHirsch

相關問題