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

Ajax ember数据-加载复杂数据结构的最佳策略,ajax,ember.js,ember-data,Ajax,Ember.js,Ember Data,我使用的是余烬数据2.0。我想在启动时从服务器加载所有数据。那么,在初始加载之后,应用程序真的很快。应用程序是移动的,并且可能具有不同的带宽。我想尽快加载数据。我想使用JSON API来遵守使用余烬数据的最新方式 每个对象都很小,只有几个属性。但可能要加载200个这样的对象 最好是做很多小的ajax调用还是一个大的ajax调用?我想使用一个包含我所有对象的大调用会更快,但是使用JSON API和现成的适配器可以吗 当然,我可以只使用findAll(),但这只会加载一种类型的所有对象。我的模型中有

我使用的是余烬数据2.0。我想在启动时从服务器加载所有数据。那么,在初始加载之后,应用程序真的很快。应用程序是移动的,并且可能具有不同的带宽。我想尽快加载数据。我想使用JSON API来遵守使用余烬数据的最新方式

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

最好是做很多小的ajax调用还是一个大的ajax调用?我想使用一个包含我所有对象的大调用会更快,但是使用JSON API和现成的适配器可以吗

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


使用什么样的最佳策略以及如何使用余烬数据和适配器实现这一点?

您可以使用余烬数据从一个现成的有效负载将不同类型的数据加载到存储中。默认情况下,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');
});
import DS from 'ember-data';
export default DS.Model.extend({
    comment: DS.attr('string'),
    post: DS.belongsTo('post');
});
/models/comment.js

import DS from 'ember-data';
export default DS.Model.extend({
    title: DS.attr('string'),
    body: DS.attr('string'),
    comments: DS.hasMany('comment');
});
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')
时,余烬数据将请求
/posts
端点,接收有效负载并将post和注释推送到存储。所有关系都将得到妥善解决

但也有一些注意事项:

  • 如果使用
    {async:true}
    定义模型关系,则余烬数据将始终命中服务器以获取关系记录

  • 在应用程序的任何地方,您都需要使用
    store.peek()
    store.peekAll()
    而不是
    store.find()
    store.findAll()
    ,以便从存储中而不是从服务器中获取记录