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

Unexpected behavior with ArrayObserver on DS.hasMany Relationship

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

但是,传递给 arrayWillChangearrayDidChange 回调的参数在观察 "plain" Ember.ADS.hasMany 关系的变化之间表现出不一致的行为.

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

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

  1. 这是预期的行为吗?
  2. 如果是这样,在 DS.hasMany 关系中仅监视 added/removed 个元素的最佳方法是什么?

我已经设置了行为演示:DEMO

编辑:

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

编辑 2:

这看起来像是预期的行为。 Ember-data 正在通过 filter 删除已删除项目和 concat 新项目生成新数组。这发生在 flushCanonicalhttps://github.com/emberjs/data/blob/339b79aa3ea82e9be1a8f39db36ec1133d0b65a2/packages/ember-data/lib/system/many-array.js#L67

我已经以一种有点不直观的方式解决了我的问题。我没有将 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