ArrayObserver 在 DS.hasMany 关系上的意外行为
Unexpected behavior with ArrayObserver on DS.hasMany Relationship
我正在尝试使用 DS.hasMany.addArrayObserver
来监视何时插入新元素(创建客户端或从服务器加载)。
但是,传递给 arrayWillChange
和 arrayDidChange
回调的参数在观察 "plain" Ember.A
与 DS.hasMany
关系的变化之间表现出不一致的行为.
对于 Ember.A
数组,正确的 addCount
和 removeCount
被传递,但是对于 DS.hasMany
,removeCount
总是等于旧的数组的长度和 addCount
总是等于数组的新长度。
换句话说,看起来DS.hasMany
"array" 被清空了,每次都添加了所有新记录。我有两个问题:
- 这是预期的行为吗?
- 如果是这样,在
DS.hasMany
关系中仅监视 added/removed 个元素的最佳方法是什么?
我已经设置了行为演示:DEMO
编辑:
我还在 ember-data github 上开了一个问题:https://github.com/emberjs/data/issues/2981
编辑 2:
这看起来像是预期的行为。 Ember-data 正在通过 filter
删除已删除项目和 concat
新项目生成新数组。这发生在 flushCanonical
:https://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
});
});
我正在尝试使用 DS.hasMany.addArrayObserver
来监视何时插入新元素(创建客户端或从服务器加载)。
但是,传递给 arrayWillChange
和 arrayDidChange
回调的参数在观察 "plain" Ember.A
与 DS.hasMany
关系的变化之间表现出不一致的行为.
对于 Ember.A
数组,正确的 addCount
和 removeCount
被传递,但是对于 DS.hasMany
,removeCount
总是等于旧的数组的长度和 addCount
总是等于数组的新长度。
换句话说,看起来DS.hasMany
"array" 被清空了,每次都添加了所有新记录。我有两个问题:
- 这是预期的行为吗?
- 如果是这样,在
DS.hasMany
关系中仅监视 added/removed 个元素的最佳方法是什么?
我已经设置了行为演示:DEMO
编辑:
我还在 ember-data github 上开了一个问题:https://github.com/emberjs/data/issues/2981
编辑 2:
这看起来像是预期的行为。 Ember-data 正在通过 filter
删除已删除项目和 concat
新项目生成新数组。这发生在 flushCanonical
:https://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
});
});