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.如果你想懒洋洋地加载,存储和显示关系的数据,而不集团国王用户界面:
有几种方法可以做到这一点。延迟加载数据时我喜欢的一种方式如下:
首先我创建一个封装了我的数据的显示和加载的组件。在你的例子中,我会打电话给我的组件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>
这种方法结合了许代理阵列代理以像阵列,而且该数据是否被加载提供信息。
可以在ember.js使用该组件为每个组件:
{{book-shelf author=mySpecialAuthor}}
非常感谢@Timm,但我需要这不是在DOM,而不是在一个组件。在作者页面中,我需要(仅在作者页面呈现后)才能在后台获取书籍数据。通过这种方式,每个作者的书籍数据已准备好点击任何作者(和书页翻译...)。 –
因此,也许新增加的“第一”解决方案将为你工作? – Timm