2014-04-28 51 views
2

我在我的視圖中使用@each觀察控制器屬性(對象)。每次,@each更改,我想知道,其中項目已更改。觀察@each並獲取更新項目

有沒有辦法找到它?

Docket.OrganizationView = Ember.View.extend({ 

    chartObserver: function() { 

    console.log(THE_ITEM_OF_CHARTDATA_THAT_HAS_CHANGED) 

    }.observes('[email protected]') 

}); 
+0

我懷疑你可以得到它。讓我們來看看。觀察者實際上可以通過多種方式發起。由於它的圖表數據,我建議你重繪整個圖表。 – thecodejack

+0

問題是,有5個圖表,即使只有一個數據集發生了變化,我也不想重繪5個圖表。 '@ each'包含不同圖表的數據。我暫時將它們存儲在不同的屬性中,但我認爲這個問題無論如何都是有趣的。 – Slevin

+0

我有同樣的問題有時回來...我無法找到解決方案..我做了什麼是在該數據對象本身添加的關鍵....是的問題是非常有趣的,會很好,如果有解決這個.. – thecodejack

回答

1

你可以定義你的控制器,因爲這example一個ArrayComputed屬性。

ArrayComputed:創建其操作上依賴 陣列和與「一次一個」語義更新一個計算屬性。

Ember.ArrayController.extend({ 

    changedContent: Ember.arrayComputed("[email protected]", { 

    addedItem: function(array, item, changeMeta, instanceMeta) { 
     array.clear(); 
     array.pushObject(item); 
     return array; 
    }, 
    removedItem: function(array, item, changeMeta, instanceMeta) { 

     array.clear(); 
     array.pushObject(item); 
     return array; 

    } 
    }), 

}); 
1

使用的observesBefore調用存儲陣列在改變之前,這樣就可以用更改後的陣列進行比較:

Docket.OrganizationView = Ember.View.extend({ 
    chartDataWillChange: function() { 
    this._oldChartData = this.get('controller.chartData').slice(0); 
    }.observesBefore('[email protected]') 

    chartDataDidChange: function() { 
    var oldChartData = this._oldChartData; 
    var newChartData = this.get('controller.chartData'); 

    // Compare the contents of the two arrays 
    // to find out what has changed 
    var addedItems = newChartData.filter(function(item) { 
     return !oldChartData.contains(item); 
    }); 
    var removedItems = oldChartData.filter(function(item) { 
     return !newChartData.contains(item); 
    }); 
    }.observes('[email protected]') 
});