Ember-Data,嵌入式关系记录和服务器JSON响应

时间:2013-07-05 14:16:27

标签: ember.js ember-data

使用Ember RC6和Ember-Data v0.13-54在自定义服务器PHP API上运行应用程序遇到模型关系(主要是多对多)和侧载的一些问题。

问题中的模型是:

App.Member = DS.Model.extend({
  apiToken: DS.attr('string'),
  apiTokenExpire: DS.attr('string'),
  favourites: DS.hasMany('App.Presentation')
});

App.Presentation = DS.Model.extend(
{
  title: DS.attr('string'),
  description: DS.attr('string'),
  date: DS.attr('date'),

  category: DS.belongsTo('App.Category'),
  tags: DS.hasMany('App.Tag'),
  employees: DS.hasMany('App.Member'),

  presentation: DS.belongsTo('App.File'),
  presenterNotes: DS.belongsTo('App.File'),
  cover: DS.belongsTo('App.Image')
});

让RESTAdapater发送与我拥有的Member模型的关系:

App.APIRESTAdapter.map('App.Member', {
  favourites: {embedded: 'always'}
});

加载/members/1时,服务器返回:

{
  "member": {
    "api_token": "9fa236ad58726584d7b61bcf94b4dda37cbd3a24",
    "api_token_expire": "1383832335",
    "id": 1,
    "favourite_ids": [ 3 ],
    "group_ids": [ 2 ]
  },
  "presentations": [
    {
      "title": "That's a new one!",
      "category_id": 2,
      "id": 3,
      "tag_ids": [ 1 ],
      "employee_ids": [ 1 ]
    }
  ]
}

但是,如果我记录get('member.favourites').mapProperty('id'),我会得到一个空数组,favourites实际上没有添加Member模型。

如果我在RESTAdapter上禁用favourites的嵌入,一切正常。我只是想知道是否有一些我遗漏的东西或者是否存在关于如何格式化JSON响应的问题?


修改

进行了一些挖掘,似乎问题来自于关系名称(收藏夹员工)与模型名称( Member < / em>, Presentation )在加载数据时使用。奇怪,因为转。 12个https://github.com/emberjs/data/blob/master/BREAKING_CHANGES.md模型应该按类型侧载。

做一些测试我为这两个模型添加了一个新的多对多关系:

App.Member获取presentations: DS.hasMany('App.Presentation')

App.Presentation获取members: DS.hasMany('App.Member')

服务器返回的JSON完全相同,当记录get('member.presentations')时,我现在可以获得应该的演示文稿列表。

此时这对我来说似乎是个错误,但也许我错过了什么?我已尝试在RESTAdapater上为收藏夹员工进行映射,但这没有帮助......也许还有一些其他适配器配置可以提供帮助吗?

1 个答案:

答案 0 :(得分:1)

这不是 sideloading 问题,但更多的是我个人对嵌入式数据的错误以及配置意味着什么。 由于适配器配置为:

App.APIRESTAdapter.map('App.Member', {
  favourites: {embedded: 'always'}
});

服务器的预期JSON响应是:

{
  "member": {
    "api_token": "b84fd204b37d3fa3cee8a2b2cac8bd4fd02635a1",
    "api_token_expire": "1384027367",
    "id": 1,
    "favourites": [
      {
        "title": "Some kind of title",
        "category_id": 1,
        "id": 2,
        "tag_ids": [ 1 , 2 ],
        "employee_ids": [ 1 ]
      }
    ]
  }
}

当记录被标记为嵌入时,"favourite_ids": [ X, X, X ]应该是"favourites": [ HASH, HASH, HASH ]