我有一个应用程序,它使用ember-data来持久化数据,使用StateManager来驱动其全局状态。因为,加载数据是异步的,我想知道如何捕获表示所有数据都已加载的事件。 确切地说,我有一个名为“loading”的状态,我在其中加载数据:
App.store.find(App.Model, ....)
加载模型后,我会进行一些后期处理。这是在名为“后处理”的“加载”子状态中完成的。当每个模型获得“didLoad”事件时,我转到“后处理”:
App.Model = DS.Model.extend {
didLoad: ->
stateManager.send('postProcess',this)
}
当加载和后处理每个数据时,应用程序应转换到与“加载”处于同一级别的另一个“编辑”状态:
loading -> postprocessing
root /
\
editing
我应该抓住哪些事件来实现转型? ember-data Store是否有回调函数?
答案 0 :(得分:5)
使用ember-data时,find方法返回一个数组代理。您可以观察该对象上的isLoaded字段。
var data = App.store.find(App.Model, {});
data.addObserver('isLoaded', function() {
if (data.get('isLoaded')) {
....
}
});
但请记住通过removeObserver清理你的观察者。
我将此实用程序添加到内置的ember-data记录数组中。
DS.RecordArray.reopen({
onLoad: function(callback) {
if (this.get('isLoaded')) {
callback(this);
} else {
var that = this;
var isLoadedFn = function() {
if (that.get('isLoaded')) {
that.removeObserver('isLoaded', isLoadedFn);
callback(that);
}
}
this.addObserver('isLoaded', isLoadedFn);
}
return this;
}
}
所以现在你可以做到
App.store.find(App.Model, {}).onLoad(function(data) {
....
});
您也可以执行类似
的操作init: function() {
this.set('data', App.store.find(App.model, {}));
},
onData: function() {
if (this.get('data.isLoaded')) {
...
}
}.observes('data.isLoaded')
答案 1 :(得分:0)
尝试观察“content@each.isLoaded”并在模型的arrayController中调用stateManager.sent(“editing”)。类似的东西:
App.ModelArrayController.reopen({
didLoadAllContent: function () {
if (content.everyProperty('isLoaded')) {
stateManager.transitionTo('editing');
}
}.observes("content.@each.isLoaded")
)}
当然,可能是一种更简单的方法。或者也许是更正确的......