我在使用Ember数据夹具适配器时遇到问题。保存记录时,所有记录的所有关联都将丢失。我创建了一个简单的JS Bin来说明问题:http://jsbin.com/aqiHUc/42/edit
如果您编辑任何用户并保存,则所有项目都会消失。
这是使用Ember 1.0.0和最新的Ember Data canary版本。
我不确定我是否做错了,或者这是否与Ember Data有关。
由于
答案 0 :(得分:10)
要回答我的问题,DS.JSONSerializer.serializeHasMany
似乎只处理和序列化manyToNone和manyToMany关系类型。您可以通过为模型使用自定义序列化程序来覆盖此行为:
var get = Ember.get;
App.UserSerializer = DS.RESTSerializer.extend({
serializeHasMany: function(record, json, relationship) {
var key = relationship.key;
var relationshipType = DS.RelationshipChange.determineRelationshipType(record.constructor, relationship);
if (relationshipType === 'manyToNone' || relationshipType === 'manyToMany' || relationshipType === 'manyToOne') {
json[key] = get(record, key).mapBy('id');
}
}
});
仍然不太确定这是否是一个错误,或者这是否是预期/预期的行为。
答案 1 :(得分:7)
我遇到了同样的问题并找到了同样的解决方案。当然这是ember-data中的一个错误?
这是我的解决方案,唯一的区别是我正在修改JSONSerializer,而不是扩展RESTSerializer,因为我正在使用本地存储适配器。:
DS.JSONSerializer.reopen({
serializeHasMany : function(record, json, relationship) {
var key = relationship.key;
var relationshipType = DS.RelationshipChange.determineRelationshipType(
record.constructor, relationship);
if (relationshipType === 'manyToNone'
|| relationshipType === 'manyToMany'
|| relationshipType === 'manyToOne') {
json[key] = Ember.get(record, key).mapBy('id');
// TODO support for polymorphic manyToNone and manyToMany
// relationships
}
}
});
答案 2 :(得分:3)
这不是一个错误,而是Ember Data中的设计选择。
JSONSerializer.serializeHasMany方法没有按设计序列化manyToOne;通常外键持久存在于关系的belongsTo端,而hasOne可能不会持久存在外键
本文解释了解决方法:http://www.toptal.com/emberjs/a-thorough-guide-to-ember-data请参阅“一对多和多对一关系”部分,黑客是强制将DS.hasMany ID序列化为好吧,您可以像attrs: {someRelationship: {serialize: 'ids'}}
答案 3 :(得分:2)
现在删除了DS.RelationshipChange。您应该使用record.constructor,如:
record.constructor.determineRelationshipType(relationship)
显示您的关系类型。