2012-12-06 66 views
4

我正在努力解决一个奇怪的问题。我有一个模型叫Activity像这样定义的属性:Ember-data从JSON映射嵌入对象

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) 

但它没有帮助。

+0

你能解释一下你的意思是当你说“它很好地映射”或“它并没有很好地”?也许你可以设置一个JSFiddle的例子? –

+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