3

Ember アプリを作成しようとしていますが、問題が発生しています。

次のページをレンダリングしたいインデックスルートがあります。

+--------------------------+
|   Welcome, foo@bar.com   |
+--------------------------+
|                          |
|        New Posts         |
|        ---------         |
|          *foo            |
|          *bar            |
|          *baz            |
|                          |
+--------------------------+

だから私はAccountモデルとモデルを持っていPostます。(関連するフィールドはありません)

次の点で概念的な問題があります。

Ember ルートにはmodel、ルートのモデルを返すメソッドがあります。しかし、ルートに複数のモデルを関連付けたい場合はどうすればよいでしょうか? この場合、 と がAccountありPostます。両方を自分のページで利用できるようにするにはどうすればよいですか?

私が試したことの 1 つは、テンプレートからアクセスできるように、コントローラーでおよびsetupControllerを手動で設定することです。しかし、私がこれを行うことができれば、その方法のポイント/意義は何ですか!?accountpostsmodel

Ember がルートを 1 つのモデルのみに関連付けたいのはなぜですか?

アドバイスをいただければ幸いです。

ありがとう、ダニエル

4

2 に答える 2

1

コールバックを使用するmodelと、いくつかの利点があります。

  1. ルーターを定義すると、モデル コールバックが自動的に生成されます。
  2. テンプレートで を使用しlink-to "someRoute" model、そのリンクをクリックして別のルートに遷移すると、ルートはそのモデルに渡したモデルを使用します (modelコールバックを呼び出してデータを取得することはありません)。

http://emberjs.com/api/classes/Ember.Route.html#method_modelを参照してください

しかし、私が思う最大の利点は、約束のサポートです。

ルートはmodelコールバックを使用して必要なデータを取得し、次に でsetupControllerそのデータを 2 番目の引数に渡します。

setupController がmodelコールバックからデータを取得するという意味に注意してください。コールバックが promise を返す場合、modelルートはこの promise が解決されるまで待機し、promise からデータを取得します。promise が処理中の場合、setupControllerは呼び出されず、テンプレートはレンダリングされません。

App.PostsRoute = Em.Route.extend({
  model: function() {
    // The server response an array of posts like [{name: 'foo'}, {name: 'bar'}, {name: 'baz'}]
    return $.get('/api/posts.json');
  },

  setupController: function(controller, model) {
    console.log(model);  // it's array, not promise object
    controller.set('model', model);
  }
});

を使用setupControllerして同じことを実行できる場合は、次のようになります。

App.PostsRoute = Em.Route.extend({
  setupController: function(controller, model) {
    $.get('/api/posts.json').then(function(data) {
      controller.set('model', data);
    });
  }
});

ただし、setupControllerpromise はサポートしていません。つまり、サーバーからデータを取得するとsetupController、Ember はデータが準備される前にテンプレートをレンダリングします。多くの場合、それは私たちが望むものではありません。

しかし、modelサーバーから複数のデータを取得するのには適していないようです。Ember.RSVP.all複数のプロミスを使用してそれを行うことができます。しかし、あなたも考慮する必要がありますlink-to。ルートで複数のデータを取得し、テンプレートをレンダリングする前にすべてのデータが準備されるのを待つベスト プラクティスが何であるかはわかりません。誰か良い解決策があれば教えてください!

あなたの状況では、これを行うために別のルートを使用できると思います。結局、「ようこそ、foo@example.com」のようなものは、すべてのページのトップバーだと思いますよね? 次に、それを に入れ、アカウント情報をテンプレートApplicationRouteにレンダリングできます。application.hbs

于 2013-10-19T01:34:31.647 に答える