2013-12-09 78 views
1

我們如何觀察Ember中數組的變化?我有一個從模型使用的原始對象數據燼組成部分,但證明我使用的部件中數組屬性的問題本身一樣:如何觀察控制器/組件內陣列的變化

init:function(){ 
      this._super(); 
      var arr = Ember.A([ 
       Ember.Object.create({"shelfNo": 1, "noOfItems": 2}), 
       Ember.Object.create({"shelfNo": 2, "noOfItems": 3}), 
       Ember.Object.create({"shelfNo": 3, "noOfItems": 2})] 
      ); 
      this.set("someArray",arr); 

      //DOES NOT WORK 

      this.get('someArray').addArrayObserver(function() { 
       Ember.ObjectController.create({ 
        arrayWillChange: function (observedObj, start, removeCount, addCount) { 
         console.log("in arrayWillChange"); 
        }, 
        arrayDidChange: function (array, start, removeCount, addCount) { 
         console.log("in arrayDidChange"); 
        } 
       }); 
      }); 

     } 

我也試過:

testObserver: function(){ 
      //DOES NOT WORK 
      console.log("here"); 
     }.observes('[email protected]') 

但兩者沒」爲我工作!

這裏是一個jsbin:http://jsbin.com/EkumOjA/1/

感謝, 迪

回答

6

如果你正在觀察從陣列中某個對象的屬性使用[email protected]。觀察數組內容何時更改(someArray.pushObject,removeObject等)使用someArray.[]someArray.length

此外,而不是覆蓋init使用someFunc: function() {}.on('init')這是獲得觀察員工作,對象初始化的安全方式。

這是你更新後的代碼:

App.ShowQuestionComponent = Ember.Component.extend({ 
    someArray : null, 
    initializeSomeArray:function(){     
     var arr = Ember.A([ 
      Ember.Object.create({"shelfNo": 1, "noOfItems": 2}), 
      Ember.Object.create({"shelfNo": 2, "noOfItems": 3}), 
      Ember.Object.create({"shelfNo": 3, "noOfItems": 2})] 
     );    

     this.set("someArray",arr); 
    }.on('init'), 
    testObserver: function(){     
     console.log("here"); 
    }.observes('someArray.[]') 

}); 

而更新後的jsbin http://jsbin.com/EkumOjA/2/edit

+0

感謝馬爾西奧,我意識到我錯過了。我應該完成.observes('someArray。@ each')而不是.observes('someArray @ each') - 我錯過了「。」。沒有你的jsbin,我無法弄清楚我的問題。謝謝。 –

+2

不客氣。要記住,如果你想觀察內容的變化,只需使用'someArray。[]',因爲'someArray。@ each'旨在觀察數組中的屬性,它會在每個項目中添加追隨者, '的someArray。[]'。 –