4

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

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

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

some single properties and

user: { id: etc. }

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

owner

user

它映射得很好。但我想离开所有者,因为它更好地代表了我的意思。我试过这个动作:

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

但这没有帮助。

4

1 回答 1

1

首先,我建议使用最新的 Ember / EmberData,但您需要通过增强extractSingle自定义序列化程序来手动处理嵌入记录(参见下面的示例)。此外,您应该像这样定义关系:

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);
  }
});

示例 JSBin

于 2013-09-29T21:17:20.377 回答