我试图更新Ember中的hasMany关系,但我在使数据正确发送方面遇到了一些麻烦。
我有以下Ember型号:
// models/post.js
export default DS.Model.extend({
title: DS.attr('string'),
tags: DS.hasMany('tag', { async: true })
});
// models/tag.js
export default DS.Model.extend({
title: DS.attr('string'),
post: DS.belongsTo('post', { async: true })
});
然后我在我的路线中执行以下操作来创建新标记并更新帖子:
addTag: function() {
var post = this.get('currentModel');
var newTag = this.store.createRecord('tag', {
title: 'Lorem Ipsum',
post: post
});
newTag.save().then(function() {
post.get('tags').pushObject(newTag);
post.save();
});
}
新标记已成功创建并由我的Express api保存,但帖子未正确保存。它由api接收但是Ember发出的请求有效负载从不包含标签ID(它确实发送了标签标题)。我究竟做错了什么?非常感谢任何帮助!
事实证明,RESTSerializer默认不会序列化并包含hasMany关系的相关ID。它只包含了belongsTo方面的内容,因为它希望API能够在需要的地方保存它。我可能会更改我的API以适应此行为,因为它更有效但是如果遇到任何其他人,可以通过扩展序列化程序并使用DS.EmbeddedRecordsMixin
使序列化程序包含ID mixin - http://emberjs.com/api/data/classes/DS.EmbeddedRecordsMixin.html - 看起来像这样:
export default DS.RESTSerializer.extend(DS.EmbeddedRecordsMixin, {
attrs: {
tags: { serialize: 'ids' }
}
});
答案 0 :(得分:0)
您无需在帖子上调用.save()。当您调用createRecord创建标记时,您的后端会收到post的id,并应相应地保留依赖项。
addTag: function() {
var post = this.get('currentModel');
this.store.createRecord('tag', {
title: 'Lorem Ipsum',
post: post})
.save()
.then(function(tag) {
post.get('tags').pushObject(tag);
});
答案 1 :(得分:0)
遇到同样的问题。
目前我通过serializeHasMany
hook解决了这个问题。
// app/serializers/application
import {ActiveModelSerializer} from 'active-model-adapter';
export default ActiveModelSerializer.extend({
serializeHasMany: function(snapshot, json, relationship){
this._super.apply this, arguments
if (!json[relationship.type + '_ids']){
var ids = []
snapshot.record.get(relationship.key).forEach(function(item){
ids.push item.get 'id'
});
json[relationship.type + '_ids'] = ids
}
}
})