我有这两个资源:
App.Users = DS.Model.extend({
first_name: DS.attr('string'),
last_name: DS.attr('string'),
email: DS.attr('string'),
userprofile: DS.belongsTo('App.Userprofiles', {embedded:true}),
fullName: function() {
return this.get('first_name') + ' ' + this.get('last_name');
}.property('first_name', 'last_name'),
didLoad: function() {
console.log('Developer model loaded', this);
}
});
App.Userprofiles = DS.Model.extend({
company: DS.attr('string'),
user: DS.belongsTo('App.Developers'),
didLoad: function() {
console.log('Developer Profile model loaded', this);
}
})
这些是我的观点和控制者:
App.UserInfoController = Ember.ObjectController.extend({
content: App.store.find(App.Users, 1),
}).create();
App.UserInfoView = Ember.View.extend({
controller: App.UserInfoController,
contentBinding: 'controller.content'
});
这是来自我的API的用户示例响应
{
"email": "foo@gmail.com",
"first_name": "George",
"id": "1",
"last_name": "Eracleous",
"resource_uri": "/api/v1/users/1/",
"userprofile": {
"company": "bar",
"id": "1",
"resource_uri": "/api/v1/userprofiles/1/",
"user": "/api/v1/users/1/"
}
}
正确加载用户对象但是当我尝试get(“userprofile”)时,我得到null。有人知道我做错了吗?
答案 0 :(得分:1)
为了加载嵌入的相关对象,您必须通过调用其“map”函数来配置适配器使用的序列化程序。我知道这样做的唯一方法是通过子类化序列化程序并向其添加“init”函数,在那里进行必要的map调用。对于每个模型类的每个嵌入式关系,您都必须调用“map”。这适用于一对一关系。确保将适配器配置为使用此序列化程序。 有关示例,请参阅上一个问题my answer。 您也可以在线查看this example。
如注释中所述,您可以直接在适配器类上调用map(),而不是继承序列化器并在初始化器中调用它的map()函数。举个例子,这是我自己的代码的摘录。
WO.RESTAdapter.map(App.Category, {
resourceTypes: {
embedded: 'load'
}
});
WO.RESTAdapter.map(App.Resource, {
resourceType: {
embedded: 'load'
}
});
WO.RESTAdapter.map(App.Reservation, {
resource: {
embedded: 'load'
},
user: {
embedded: 'load'
}
});
App.serializer = App.WOSerializer.create();
App.store = DS.Store.create({
revision: 10,
adapter: WO.RESTAdapter.create({
namespace: "cgi-bin/WebObjects/Reserve.woa/ra",
serializer: App.serializer
}),
serializer: App.serializer,
adapterForType: function(type){
return this.get('adapter');
}
});