2

私の別の質問(これはより具体的だと思います)のフォローアップとして、アプリの起動時にデータをロードする方法をお尋ねしたいと思います。キャッシュ戦略が必要です。

内部アプリに表示されるデータは週に 1 回更新されるため、ユーザーがルートに入るたびに新しいリクエストを作成する必要はありません (現在、多くの ajax リクエストがアプリ内を移動しています)。

.all() メソッドはおそらく私の問題を解決するでしょうが、最初にデータをロードする必要があります。

コントローラー、次にテンプレートにアクセスできるデータを他にどこにロードできますか? modelアプリの起動時にデータを読み込んで、フックとフックのようにコントローラーに渡すことはできますcontrollerForか?

私の意見では、ユーザーが週に 1 回アプリを更新しなければならないことは問題ありません。後で変更できるかもしれません。

直感的なピクセルの答えの私の理解

最初にサーバーからデータをロードします。

App = Ember.Application.create({
    ready: function() {
        this.set('userCache', App.User.find());
        this.set('currentUserCache', App.User.find(1));
        this.set('topCache', App.Top.find());
    }
});

次に、キャッシュからデータをロード (ストア)

App.SomeRoute = Ember.Route.extend
  setupController: (controller, model) ->
    @controllerFor('user').set 'content', App.User.all()
    # though I can access its properties via console data is not visible in the template
    @controllerFor('currentUser').set 'content', App.User.all().objectAt(0)
    @controllerFor('top').set 'content', App.Top.all()

たとえば、次の方法でアバター ソースにアクセスできます。

App.CurrentUser.all().objectAt(0).get('gravatar')

テンプレートには表示されません

{{#linkTo 'users' classNames="avatar pull-left" title="back"}}
  {{avatar gravatar}}
{{/linkTo}}

content.gravatar私もorで試しましcontroler.gravatarたが、成功しませんでした。 残りはビューに表示されます

4

1 に答える 1

2

概念的にのみ、次のようなことができます。

App = Ember.Application.create({
  // Load your data once and set it somewhere accessible
  ready: function() {
    this.set('superModelCache', App.SuperModel.find());
  }
});


// Define your special model
App.SuperModel = DS.Model.extend({
  prop1: DS.attr('string'),
  prop2: DS.attr('string'),
  ...
});

// And then in all the routes that need data from your cache
// you could do something like this
App.MyFirstRoute = Ember.Route.extend({
  model: function () {
    return App.get('superModelCache.prop1');
  }
});

// and so on...
App.MySecondRoute = Ember.Route.extend({
  model: function () {
    return App.get('superModelCache.prop2');
  }
});

または、ルートで次のようなこともできます。

// And then in all the routes that need data from your cache
// you could do something like this
App.MyFirstRoute = Ember.Route.extend({
  model: function () {
    return App.SuperModel.all().get('prop1');
  }
});

// and so on...
App.MySecondRoute = Ember.Route.extend({
  model: function () {
    return App.SuperModel.all().get('prop2');
  }
});

これは、アプリケーションの開始時に GET 要求を発行するだけであり、アプリケーションの有効期間に沿って間隔/ポーリングを使用してデータをリロードできます。

アプリケーションの開始がデータに依存している場合は、終了時にApp.deferReadiness();対応するものを呼び出すこともできApp.advanceReadiness();ます。参照用の API ドキュメントを参照してください: http://emberjs.com/api/classes/Ember.Application.html# method_deferReadiness

それが役に立てば幸い

于 2013-05-15T08:44:39.093 に答える