>我有这两个资源:
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("用户配置文件")时,我得到空值。有人知道我做错了什么吗?
为了加载嵌入的相关对象,您必须通过调用适配器的"map"函数来配置适配器使用的序列化程序。我知道这样做的唯一方法是对序列化程序进行子类化并向其添加一个"init"函数,您可以在其中对 map 进行必要的调用。对于每个模型类的每个嵌入式关系,您都必须调用"map"。这适用于一对多关系。确保将适配器配置为使用此序列化程序。有关示例,请参阅我对上一个问题的回答。您也可以在线查看此示例。
如注释中所述,无需对序列化程序进行子类化并在初始化器中调用其 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');
}
});