DS.hasMany关系上ArrayObserver的意外行为

时间:2015-04-08 23:19:07

标签: ember.js ember-data

我正在尝试使用DS.hasMany.addArrayObserver来监控何时插入新元素(创建客户端或从服务器加载)。

但是,传递给arrayWillChangearrayDidChange回调的参数在观察对“普通”Ember.ADS.hasMany关系的更改之间显示出不一致的行为。

对于Ember.A数组,传递了正确的addCountremoveCount,但DS.hasMany removeCount总是等于旧addCount数组和DS.hasMany总是等于数组的新长度。

换句话说,看起来DS.hasMany“数组”被清空,每次都添加所有新记录。我有两个问题:

  1. 这是预期的行为吗?
  2. 如果是,那么监控filter关系中添加/删除元素的最佳方法是什么?
  3. 我已经设置了行为演示:DEMO

    编辑:

    我还在ember-data github上打开了一个问题:https://github.com/emberjs/data/issues/2981

    编辑2:

    这看起来像是预期的行为。 Ember-data通过concat删除已删除的项目和flushCanonical新项目生成新阵列。这发生在{{1}}:https://github.com/emberjs/data/blob/339b79aa3ea82e9be1a8f39db36ec1133d0b65a2/packages/ember-data/lib/system/many-array.js#L67

1 个答案:

答案 0 :(得分:0)

我以一种非直观的方式解决了我的问题。我没有直接向模型的ArrayObserver关系添加HasMany,而是使用DS.Store.filter()获取相关记录,并使用addArrayObserver结果。

相关代码:

var collection = this.store.filter('child', function(record){ return record.get('parent.id') === "1"; });
collection.then(function(records){
    records.addArrayObserver({
          arrayWillChange: function(obj, start, removeCount, addCount) {
            console.log("Filter", start, removeCount, addCount);
          },
          arrayDidChange: Ember.K
        });     
});

DEMO