2

私の質問を説明するために、私は考案された例を作成しましたので、我慢してください。2つの関連する残り火データモデルがあり、それぞれに同じタイプの埋め込み関連付けがあります。

App.Article = DS.Model.extend({
  title: DS.attr("string"),
  summary: DS.belongsTo(App.Summary, {embedded: true}),
});

App.Book = DS.Model.extend({
  title: DS.attr("string"),
  summary: DS.belongsTo(App.Summary, {embedded: true}),
});

App.Summary = DS.Model.extend({
  text: DS.attr("string"),
});

ember-dataの優れた機能の1つはfind()、実際のデータ値がサーバーから取得される前でも、ビューのレンダリングに使用できる正しいタイプのオブジェクトを返すことです。ただし、この便利さはアソシエーションに完全には及ばないのではないかと心配しています。

このような場合、複数のタイプのオブジェクトが同じタイプの関連データを共有するときに、オブジェクトとオブジェクトSummaryの両方のオブジェクトを表示するビューを再利用したいと思います。特に、私は次のことをしたいと思います。BookArticle

book: Ember.Route.extend({
  route: '/book',
  connectOutlets: function(router) {
    book = App.Book.find(1);
    router.get('applicationController').connectOutlet('titleOutlet', 'book', book);
    router.get('applicationController').connectOutlet('summaryOutlet', 'summary', book.get('summary'));
  },
}),

つまり、本固有のものに対して1つのビューを作成し、BookまたはArticleが表示されるかどうかに関係なく、要約に対して1つのビューを作成したいと思います。

残念ながら、これは、によって非同期的に呼び出されるによってブックにデータが入力されていない場合にbook.get('summary')返されるため、実行できません。nullstore.load()Book.find()

別の方法は、本のオブジェクト自体を渡し、オブジェクトのルートレベルから開始して、常にネストされたパスを参照することです。この特定のケースでは、との構造BookArticle同一であるため、違いはありません。しかし、アソシエーションを使用して、そのコンテキストとは関係なく参照したい場合は、別の方法があるはずです。

考え?

この完全な例を説明する要点をまとめました。

アップデート

私はこれが不可能であるというマイク・アスキの指摘に辞任しました。ただし、ロジックを抽象化するために、connectOutletを接続するたびに、関連付けが埋め込まれている可能性がある場所を指す、統一された名前のバインディングを作成します。connectOutletを呼び出すと、コントローラー/ビューに送信しているオブジェクトのタイプがわかります。したがって、ビューはバインディングを使用でき、オブジェクトの残りの部分について知る必要はありません。

4

1 に答える 1

1

ではなく、コンテキストとしてarticleorbookインスタンスを直接渡すようにしてください。次に、ビューで次を使用します。summaryOutletsummary

{{view.content.summary.text}}

あなたが今のところ確かに持っているものの代わりに:

{{view.content.text}}

このようにして、レコードデータがロードされるとすぐにバインディングが更新されます。

代替案は見当たりません。インスタンスにはリレーションが入力されていませんがnull、同期の命令型の方法でリレーションをトラバースしようとすると、常に取得されます...

于 2012-08-07T05:37:55.367 に答える