我正在使用ember-data 2.0。我想在启动时从服务器加载所有数据。然后在初始加载后应用程序真的很快。该应用程序是移动的,并且可能具有不同的带宽。我想尽快加载数据。我想使用JSON API来遵循使用ember-data的最新方法。
每个对象都很小,只有少数几个属性。但是可能有200个这样的对象要加载。
最好做一些小的ajax或一个大的ajax吗?我想用一个包含我所有对象的大调用会更快,但使用JSON API和开箱即用的适配器可以实现吗?
当然,我可以使用findAll(),但只会加载一种类型的所有对象。我的模型中有几个与hasMany和belongsTo关系相关的对象类型。 如果我使用开箱即用的RestAdapter,那将导致许多ajax调用,对吧?
使用的最佳策略是什么以及如何使用ember-data和适配器实现?
答案 0 :(得分:1)
您可以使用Ember Data从单个有效负载中加载不同类型的商店。默认情况下,JSON序列化程序假定有效内容中的每个根节点都对应一个类型。 让我们说你有模特:
<强> /models/post.js 强>
import DS from 'ember-data';
export default DS.Model.extend({
title: DS.attr('string'),
body: DS.attr('string'),
comments: DS.hasMany('comment');
});
<强> /models/comment.js 强>
import DS from 'ember-data';
export default DS.Model.extend({
comment: DS.attr('string'),
post: DS.belongsTo('post');
});
你有一个端点/posts
响应有效载荷,如下所示:
{
"posts": [
{
"id": 1,
"title": "Post 1",
"body": "Post 1 body",
"comment_ids": [1, 2]
},
{
"id": 2,
"title": "Post 2",
"body": "Post 2 body",
"comment_ids": [3]
}
],
"comments": [
{
"id": 1,
"comment": "Comment 1",
"post_id": 1
},
{
"id": 2,
"comment": "Comment 2",
"post_id": 1
},
{
"id": 3,
"comment": "Comment 3",
"post_id": 2
}
]
}
因此,当您执行store.findAll('post')
时,Ember Data将请求/posts
端点,接收有效负载并将帖子和评论推送到商店。所有关系都将得到妥善解决。
但有一些注意事项:
如果您使用{async: true}
定义模型关系,Ember数据将始终命中服务器以获取关系记录。
在应用中的任何地方,您需要使用store.peek()
和store.peekAll()
代替store.find()
和store.findAll()
才能从商店获取记录,但不能从服务器