Ember数据映射从JSON嵌入对象 [英] Ember-data mapping embedded object from JSON

查看:106
本文介绍了Ember数据映射从JSON嵌入对象的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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



所有者:DS .belongsTo('App.User',embedded:true)



用户当我得到这样的JSON响应时,也是一个定义的模型:

 某些单个属性和

user:{id:etc.}

我的所有属性映射良好,但用户嵌入的对象来自JSON不映射到所有者属性。但是,当我更改

 所有者

 用户

它映射良好。但是我想离开业主,因为这是我的意思的更好的表现。我试过这个动作:

 所有者:DS.belongsTo('App.User',key:'user',embedded:true )

但没有帮助。

增强自定义序列化程序中的 extractSingle (见下例)。此外,您应该定义如下所示的关系:

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

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

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

  App.ApplicationAdapter = DS.ActiveModelAdapter; 

最后,要使用所有者 code>用户,在自定义序列化程序中覆盖 typeForRoot



示例:

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

//基于: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


I am struggling with a strange problem. I have a model called Activity with a property defined like this:

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

The User is also a defined model when I'm getting the JSON response like this:

some single properties and

user: { id: etc. }

My all properties map well but the user embedded object from JSON doesn't map to the owner property. However, when I change

owner

to

user

It maps well. But I want to leave the owner because it's a better representation of what I mean. I tried this action:

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

but it didn't help.

解决方案

First, I recommend using the latest Ember / EmberData, but you will need to handle embedded records manually by enhancing extractSingle in a custom serializer (see example below). Also, you should define relationships like this:

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

Next, I recommend using the ActiveModelAdapter if you are using underscores when communicating with the server (i.e. like in EmberData 0.13):

App.ApplicationAdapter = DS.ActiveModelAdapter;

Finally, to use owner for a User, override typeForRoot in a custom serializer.

For example:

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

这篇关于Ember数据映射从JSON嵌入对象的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆