ember-data - 加载复杂数据结构的最佳策略

时间:2015-09-18 08:01:33

标签: ajax ember.js ember-data

我正在使用ember-data 2.0。我想在启动时从服务器加载所有数据。然后在初始加载后应用程序真的很快。该应用程序是移动的,并且可能具有不同的带宽。我想尽快加载数据。我想使用JSON API来遵循使用ember-data的最新方法。

每个对象都很小,只有少数几个属性。但是可能有200个这样的对象要加载。

最好做一些小的ajax或一个大的ajax吗?我想用一个包含我所有对象的大调用会更快,但使用JSON API和开箱即用的适配器可以实现吗?

当然,我可以使用findAll(),但只会加载一种类型的所有对象。我的模型中有几个与hasMany和belongsTo关系相关的对象类型。 如果我使用开箱即用的RestAdapter,那将导致许多ajax调用,对吧?

使用的最佳策略是什么以及如何使用ember-data和适配器实现?

1 个答案:

答案 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端点,接收有效负载并将帖子和评论推送到商店。所有关系都将得到妥善解决。

但有一些注意事项:

  1. 如果您使用{async: true}定义模型关系,Ember数据将始终命中服务器以获取关系记录。

  2. 在应用中的任何地方,您需要使用store.peek()store.peekAll()代替store.find()store.findAll()才能从商店获取记录,但不能从服务器

相关问题