私の質問を説明するために、私は考案された例を作成しましたので、我慢してください。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
の両方のオブジェクトを表示するビューを再利用したいと思います。特に、私は次のことをしたいと思います。Book
Article
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')
返されるため、実行できません。null
store.load()
Book.find()
別の方法は、本のオブジェクト自体を渡し、オブジェクトのルートレベルから開始して、常にネストされたパスを参照することです。この特定のケースでは、との構造Book
はArticle
同一であるため、違いはありません。しかし、アソシエーションを使用して、そのコンテキストとは関係なく参照したい場合は、別の方法があるはずです。
考え?
この完全な例を説明する要点をまとめました。
アップデート
私はこれが不可能であるというマイク・アスキの指摘に辞任しました。ただし、ロジックを抽象化するために、connectOutletを接続するたびに、関連付けが埋め込まれている可能性がある場所を指す、統一された名前のバインディングを作成します。connectOutletを呼び出すと、コントローラー/ビューに送信しているオブジェクトのタイプがわかります。したがって、ビューはバインディングを使用でき、オブジェクトの残りの部分について知る必要はありません。