Ember-data映射来自JSON的嵌入对象

时间:2012-12-06 09:22:40

标签: ember.js ember-data

我正在努力解决一个奇怪的问题。我有一个名为Activity的模型,其属性定义如下:

owner: DS.belongsTo('App.User', embedded: true)

当我收到这样的JSON响应时,User也是一个已定义的模型:

some single properties and

user: { id: etc. }

我的所有属性都映射得很好但是JSON中的用户嵌入对象没有映射到所有者属性。但是,当我改变

owner

user

它映射得很好。但我想离开主人,因为它更能代表我的意思。我尝试了这个动作:

owner: DS.belongsTo('App.User', key: 'user', embedded: true)

但它没有帮助。

1 个答案:

答案 0 :(得分:1)

首先,我建议使用最新的Ember / EmberData,但您需要enhancing extractSingle in a custom serializer手动处理嵌入式记录(请参阅下面的示例)。此外,您应该定义这样的关系:

App.Activity = DS.Model.extend({
  name:  DS.attr('string'),
  owner: DS.belongsTo('user')
});

App.User = DS.Model.extend({
  name:       DS.attr('string'),
  activities: DS.hasMany('activity')
});

接下来,如果您在与服务器通信时使用下划线,我建议使用ActiveModelAdapter :(例如在EmberData 0.13中):

App.ApplicationAdapter = DS.ActiveModelAdapter;

最后,要对owner使用User,请在自定义序列化程序中覆盖typeForRoot

例如:

App.ApplicationSerializer = DS.ActiveModelSerializer.extend({
  typeForRoot: function(root) {
    if (root == 'owner' || root == 'owners') { root = 'user'; }
    return this._super(root);
  },

  // based on: https://github.com/emberjs/data/blob/master/TRANSITION.md#embedded-records
  extractSingle: function(store, type, payload, id, requestType) {
    var owner = payload.activity.owner,
        ownerId = owner.id;

    payload.owners = [owner];
    payload.activity.owner_id = ownerId;

    return this._super.apply(this, arguments);
  }
});

Example JSBin