1.あなたはなまけUIをブロックすることなく、関係データをロードして保存したい場合:
あなたは(特別hasMany
-relationshipsで)遅延ロード関係のデータを表示したくない場合は、私がそうすることをお勧めしますafterModel
-hook:
route.js:
// ...
afterModel(authors) {
let lastPromise = new Promise(function(resolve) { resolve(); });
authors.forEach(author => {
lastPromise = lastPromise.then(() => {
return author.get('books');
});
});
},
// ...
2.あなたは怠惰ブロックせずに、ストアおよび表示関係データをロードする場合キングUI:
これを行うにはいくつかの方法があります。怠惰なデータをロードするときに好む方法の1つは、次のとおりです。
まず、データの表示とロードをカプセル化するコンポーネントを作成します。あなたの例では、私のコンポーネントをbook-shelf
と呼ぶでしょう。
DOMに挿入された後、私のコンポーネントはその書籍を表示します。次のコードを参照してください。
component.js:
import Ember from 'ember';
const {
get,
computed,
ArrayProxy,
PromiseProxyMixin,
inject: { service }
} = Ember;
const ArrayPromiseProxy = ArrayProxy.extend(PromiseProxyMixin);
export default Ember.Component.extend({
// API:
author: null,
// Internal:
store: service(),
books: computed(
'author.id',
function() {
if(!get(this, 'author.id')) {
return [];
}
return ArrayPromiseProxy.create({
promise: get(this, 'store').query('book', { authorId: get(this, 'author.id') })
});
}
),
});
そして、あなたのテンプレートで
。HBS:
<div class="book-shelf">
{{#if books.isFulfilled}}
Books of {{author.name}}:
<ul>
{{#each books as |book|}}
<li>{{book.name}}</li>
{{/each}}
</ul>
{{else}}
Loading... please wait...
{{/if}}
</div>
このアプローチでは、配列のように行動するだけでなく、データがロードされているかどうかの情報を提供するために、約束プロキシを持つ配列のプロキシを兼ね備えています。
{{book-shelf author=mySpecialAuthor}}
おかげでたくさんの@Timmを、私はいないコンポーネントで、DOMではこの必要はありません。
あなたはember.js内のすべてのコンポーネントとしてこのコンポーネントを使用することができます。著者のページでは、書籍のデータをバックグラウンドで取得するために必要です(著者ページのレンダリング後のみ)。このようにして、すべての著者の書籍データは、任意の著者(および書籍ページのレンダリング...)をクリックする準備が整います。 –
新しい "最初の"追加ソリューションがあなたのために機能するでしょうか? – Timm