所以有几个想法:
(参考:https://github.com/emberjs/data/issues/190)
如何监听数据存储中的新记录
普通的 Model.find()/findQuery() 会返回一个 AdapterPopulatedModelArray,但该数组将独立存在......它不会知道任何新内容已加载到数据库中
没有参数的 Model.find() (或 store.findAll())将返回 FilteredModelArray 的所有记录,而 ember-data 会将其“注册”到列表中,加载到数据库中的任何新记录都将添加到这个数组。
调用 Model.filter(func) 将为您返回一个 FilteredModelArray,它也已在商店中注册...并且商店中的任何新记录都会导致 ember-data 为“updateModelArrays”,这意味着它将使用以下命令调用您的过滤器函数新记录,如果你回来true,然后它会将其粘贴到您现有的数组中。
所以我最终做了什么:创建商店后,我立即调用 store.findAll(),它返回一个类型的所有模型的数组......然后我将其附加到商店......然后其他任何地方在代码中,我可以将ArrayObservers添加到这些列表中..类似于:
App.MyModel = DS.Model.extend()
App.store = DS.Store.create()
App.store.allMyModels = App.store.findAll(App.MyModel)
//some other place in the app... a list controller perhaps
App.store.allMyModels.addArrayObserver({
arrayWillChange: function(arr, start, removeCount, addCount) {}
arrayDidChange: function(arr, start, removeCount, addCount) {}
})
如何将模型推入这些“不可变”数组之一:
首先要注意的是:所有 Ember-Data 模型实例(记录)都有一个 clientId 属性...这是一个唯一的整数,用于标识数据存储缓存中的模型,无论它是否具有realserver-id 尚未(例如:在执行 Model.createRecord 之后)。
因此 AdapterPopulatedModelArray 本身有一个“content”属性...它是这些 clientId 的数组...当您迭代 AdapterPopulatedModelArray 时,迭代器会遍历这些 clientId 并返回映射的完整模型实例(记录)到每个 clientId。
那么我做了什么(这并不意味着它是“正确的”!)是观察那些 findAll 数组,并将新的 clientId 推送到 AdapterPopulatedModelArray 的 content 属性中...类似:
arrayDidChange:function(arr, start, removeCount, addCount){
if (addCount == 0) {return;} //only care about adds right now... not removes...
arr.slice(start, start+addCount).forEach(function(item) {
//push clientId of this item into AdapterPopulatedModelArray content list
self.getPath('list.content').pushObject(item.get('clientId'));
});
}
我能说的是:“它对我有用”:)它会在下一次 ember-data 更新时中断吗?完全有可能