так пару мыслей:
(ссылка: https://github.com/emberjs/data/issues/190)
как прослушать новые записи в хранилище данных
нормальная модель.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свойство ... которое является уникальным целым числом, которое идентифицирует модель в кэше хранилища данных независимо от того, имеет ли он реальный идентификатор сервера (пример: сразу после выполнения Model.createRecord).
, поэтому сам AdapterPopulatedModelArray имеет свойство "content" ... которое является массивом этих clientId ... и когда вы перебираете AdapterPopulatedModelArray, итератор зацикливается на этих clientId и возвращает вам полную модельэкземпляры (записи), которые сопоставляются с каждым clientId.
ТАК ЧТО Я СДЕЛАЛ (это не значит, что это "правильно"!) - это наблюдать за этими массивами findAll и выдвигать новые clientIdв свойство содержимого AdapterPopulatedModelArray ... ЧТО-ТО КАК:
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?вполне возможно