使用ember-data预加载嵌套数据

时间:2014-03-11 14:33:03

标签: ember.js ember-data

在我的Ember应用程序中,我有一个嵌套的hasMany关系,使用像workout->exercise->set这样的ember-data。

我的API嵌套了JSON而不是侧载JSON,因此要使用store.find('workout', id)并覆盖extractSingle来获取现有的训练。

我的问题是,在建立新的锻炼时,我需要根据用户所遵循的锻炼计划进行锻炼和预习。在服务器端,我只有一个/新控制器操作,预先填充所有内容并呈现模板。

现在我搬到了Ember,我需要相同的功能,但似乎无法使其发挥作用。我尝试的第一件事是使用Ember.$.getJSONpushPayload一起调用自定义API端点。但是,这并不起作用,因为pushPayload绕过extractSingle,这意味着我无法将嵌套的JSON转换为侧载JSON。

预填充逻辑非常复杂,因此我不希望将其复制到客户端并从API检索它。关于如何使用ember-data完成此任务的任何其他想法?

1 个答案:

答案 0 :(得分:0)

对于任何尝试使用EmberData加载嵌入式关系的人,请查看EmberData的EmbeddedRecordsMixin。

使用Ember-CLI,您需要为具有嵌入关系的模型创建一个序列化器,并在串行器中添加mixin,如下所示:

// app/serializers/my-example-model.js
import DS from 'ember-data';
export default DS.RESTSerializer.extend(DS.EmbeddedRecordsMixin, {

然后,声明一个attrs哈希,并为每个嵌入关系包含一个哈希,如下所示:

    attrs: {
        conference: { embedded: 'always' },
        organizationType: { embedded: 'always' }
    }
});

在上面的示例中,conference和organizationType都嵌入在myExampleModel模型中,用于序列化和反序列化。这意味着当我在RESTful API上使用此序列化程序时,我将获得嵌入对象,我需要放置嵌入对象。

EmbeddedRecordsMixin有关于每种关系的几个选项,因为您有单独的序列化和反序列化设置。您可以指定ids,记录或两者都不指定。 embedded:总是简写:

{
  serialize: 'records',
  deserialize: 'records'
}

这里都记录了更好的例子:

http://emberjs.com/api/data/classes/DS.EmbeddedRecordsMixin.html