我有以下的ember模型:
App.Location = DS.Model.extend({
street: DS.attr('string'),
city: DS.attr('string'),
area: DS.attr('string'),
lat: DS.attr('string'),
lng: DS.attr('string'),
report: DS.belongsTo('report', {embedded: 'always'})
});
App.Report = DS.Model.extend({
title: DS.attr('string'),
description: DS.attr('string'),
reg_num: DS.attr('string'),
location_str: DS.attr('string'),
location: DS.belongsTo('location', {embedded: 'always'})
});
在App.ReportController
中,当我尝试保存报表时,我还想在请求有效负载中嵌入位置对象。到目前为止,我尝试了以下代码:
App.ReportController = Ember.ObjectController.extend({
actions: {
saveReport: function(record) {
var self = this,
report = this.get('model'),
location = this.store.createRecord('location', {
lat: this.get('lat'),
lng: this.get('lng')
});
report.set('location', location);
report.save().then(function (result) {
self.transitionToRoute('list');
});
}
}
}
});
但是在请求中,有效负载位置始终为location: null
。
如何将location
添加到请求有效负载?
答案 0 :(得分:1)
也许我错过了一些东西,但我知道处理嵌入式记录的两种不同方式(ember-data> = 1.0.0-beta):
由于default DS.Serializer's behavior with serializing relationships,我可以假设您获得location: null
:Ember期望id
属性中的belongTo
值和hasMany
属性中的ID列表。 LocationModel
在创建之后和保存到服务器数据库之前没有id。当默认序列化程序尝试在保存ReportModel
附加新创建的LocationModel
时形成传出json有效内容时,它会获得LocationModel
(null
)的ID并将该ID放入{{ 1}}属性。
答案 1 :(得分:0)
将复合JavaScript对象放在有效载荷中不应该是火箭科学,我希望有一种不太复杂的方法来实现这一点。
确保没有为这两种关系定义belongsTo
,因为最终会出现堆栈溢出:
App.Location = DS.Model.extend({
street: DS.attr('string'),
city: DS.attr('string'),
area: DS.attr('string'),
lat: DS.attr('string'),
lng: DS.attr('string')
});
App.Report = DS.Model.extend({
title: DS.attr('string'),
description: DS.attr('string'),
reg_num: DS.attr('string'),
location_str: DS.attr('string'),
location: DS.belongsTo('location', {embedded: 'always'})
});
我必须配置PostSerializer并覆盖serializeBelongsTo以使其工作
App.PostSerializer = DS.RESTSerializer.extend(DS.EmbeddedRecordsMixin, {
attrs: {
location: {embedded: 'always'},
report: {embedded: 'always'}
}
});
DS.JSONSerializer.reopen({
serializeBelongsTo: function(record, json, relationship) {
var key = relationship.key,
belongsToRecord = Ember.get(record, key);
if (relationship.options.embedded === 'always') {
json[key] = belongsToRecord.serialize();
} else {
return this._super(record, json, relationship);
}
}
});