5

アプリケーションをレンダリングする前にロードしたい、さまざまなアプリケーションレベルのモデル (現在のユーザー、現在のアカウントなど) が多数あります。これはどこでどのように行うべきですか?この質問/回答は大いに役立ちましたが、非同期の側面はカバーしていません。

次のコードは私が望むことを達成しますが、モデルをロードするbeforeModel(promise が解決されるのを待ってそれを利用する) ことは正しくないようです。これらのモデルを にロードする必要がありApplicationRouteますか?

App.ApplicationController = Ember.Controller.extend({
  currentAccount: null
});

App.ApplicationRoute = Ember.Route.extend({
  beforeModel: function () {
    var self = this;

    return App.Account.find(...).then(function (account) {
      self.controllerFor('application').set('currentAccount', account);
    });
  }
});

ご協力いただきありがとうございます!

4

3 に答える 3

3

ネストされた Promises と ApplicationRoute の afterModel メソッドを使用して、この作業を行うことができました。

App.ApplicationRoute = Ember.Route.extend({

    model: function() {

        // load the reservation (a globally needed model)
        return App.Reservation.fetch().then(function(reservations) {
            return reservations.get('firstObject');
        });

    },

    afterModel: function() {

        // Load all other globally needed models
        var self = this;
        return App.Gender.fetch().then(function(genders) {
            self.controllerFor('application').set('genders', genders);
            return App.FilterAttribute.fetch().then(function(filterAttributes) {
                self.controllerFor('application').set('filterAttributes', filterAttributes);
                //return App.SomeOtherModel...
            });
        });

    },

    setupController: function(controller, model) {
        controller.set('reservation', model);
    }

});

完全に動作します :-) すべてのレコードがロードされるまで、アプリケーションは LoadingRoute に残ります。私はEmber Modelを使用していますが、これは何の違いもありません。Promise を返すだけでよいことに注意してください。

于 2013-09-16T12:21:33.813 に答える