观察@each并获取更新的项目

时间:2014-04-28 17:32:50

标签: ember.js

我在@each视图中观察控制器属性(对象)。每次@each更改,我想知道哪个项已更改。

有没有办法找到它?

Docket.OrganizationView = Ember.View.extend({

  chartObserver: function() {

    console.log(THE_ITEM_OF_CHARTDATA_THAT_HAS_CHANGED)

  }.observes('controller.chartData.@each')

});

2 个答案:

答案 0 :(得分:1)

您可以在控制器中定义ArrayComputed属性example

  

ArrayComputed:创建一个运算的计算属性   依赖数组并用"一次一个更新"语义。

Ember.ArrayController.extend({

  changedContent: Ember.arrayComputed("content.@each.name", {

    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 :(得分:1)

使用observesBefore调用在数组更改之前存储数组,以便您可以在更改后将其与数组进行比较:

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

  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('controller.chartData.@each')
});
相关问题