4

ember-data を使用してデータを保持し、StateManager を使用してそのグローバル状態を駆動するアプリケーションがあります。データのロードは非同期であるため、すべてのデータがロードされたというイベントをキャッチする方法を考えています。正確には、次のようにデータをロードする「ロード中」という名前の状態があります。

App.store.find(App.Model, ....)

モデルが読み込まれると、後処理が行われます。これは、「postprocessing」という名前の「loading」のサブステートで行われます。すべてのモデルが「didLoad」イベントを取得したら、「後処理」に遷移します。

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

すべてのデータがロードされて後処理されると、アプリケーションは「ロード中」と同じレベルの「編集中」の別の状態に遷移する必要があります。

      loading -> postprocessing
root /
     \
      editing

移行を行うためにキャッチする必要があるイベントは何ですか? ember-data Store にはこれに対するコールバックがありますか?

4

3 に答える 3

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')
于 2012-09-11T18:47:40.900 に答える
0

通常、モデルの状態はルートによって処理されます。

モデル フックは store.find を実行します。 http://emberjs.com/api/classes/Ember.Route.html#method_model

afterModel フックは、ルートのモデルが解決 (ロード) された後に呼び出されます。 http://emberjs.com/api/classes/Ember.Route.html#method_afterModel

于 2015-05-03T14:55:27.197 に答える
0

モデルの arrayController で "content@each.isLoaded" を観察し、stateManager.sent("editing") を呼び出してみてください。何かのようなもの:

App.ModelArrayController.reopen({
    didLoadAllContent: function () {
        if (content.everyProperty('isLoaded')) {
            stateManager.transitionTo('editing');
        }
    }.observes("content.@each.isLoaded")
)}

もちろん、もっと簡単な方法かもしれません。または、おそらくより正しいもの...

于 2012-06-10T03:58:37.687 に答える