Ember数据和Ember StateManager

jra*_*ary 4 ember.js ember-data

我有一个应用程序使用ember-data来持久化数据和StateManager来驱动它的全局状态.因为,加载数据是异步的,我想知道如何捕获表示所有数据都已加载的事件.确切地说,我有一个名为"loading"的状态,我在其中加载数据:

App.store.find(App.Model, ....)
Run Code Online (Sandbox Code Playgroud)

加载模型时,我会做一些后期处理.这是在名为"后处理"的"加载"子状态中完成的.当每个模型都有一个"didLoad"事件时,我转到"后处理":

App.Model = DS.Model.extend {
   didLoad: ->
     stateManager.send('postProcess',this)
}
Run Code Online (Sandbox Code Playgroud)

当加载和后处理每个数据时,应用程序应转换到与"加载"处于同一级别的另一个"编辑"状态:

      loading -> postprocessing
root /
     \
      editing
Run Code Online (Sandbox Code Playgroud)

我应该抓住哪些事件来实现转型?ember-data Store是否有回调功能?

jho*_*man 5

使用ember-data时,find方法返回一个数组代理.您可以观察该对象上的isLoaded字段.

var data = App.store.find(App.Model, {});
data.addObserver('isLoaded', function() {
    if (data.get('isLoaded')) {
        ....
    }
});
Run Code Online (Sandbox Code Playgroud)

但请记住通过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;
    }
}
Run Code Online (Sandbox Code Playgroud)

所以现在你可以做到

App.store.find(App.Model, {}).onLoad(function(data) {
    ....
});
Run Code Online (Sandbox Code Playgroud)

你也可以这样做

init: function() {
    this.set('data', App.store.find(App.model, {}));
},

onData: function() {
    if (this.get('data.isLoaded')) {
        ...
    }
}.observes('data.isLoaded')
Run Code Online (Sandbox Code Playgroud)