我在使用 Ember 数据夹具适配器时遇到问题。保存记录时,该记录的所有 hasMany 关联都会丢失。我创建了一个简单的 JS Bin 来说明这个问题:http: //jsbin.com/aqiHUc/42/edit
如果您编辑任何用户并保存,所有项目都会消失。
这是使用 Ember 1.0.0 和 Ember Data 的最新金丝雀版本。
我不确定我做错了什么,或者这是否是 Ember Data 的问题。
谢谢
我在使用 Ember 数据夹具适配器时遇到问题。保存记录时,该记录的所有 hasMany 关联都会丢失。我创建了一个简单的 JS Bin 来说明这个问题:http: //jsbin.com/aqiHUc/42/edit
如果您编辑任何用户并保存,所有项目都会消失。
这是使用 Ember 1.0.0 和 Ember Data 的最新金丝雀版本。
我不确定我做错了什么,或者这是否是 Ember Data 的问题。
谢谢
为了回答我的问题,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');
}
}
});
仍然不太确定这是一个错误还是这是所需/预期的行为。
我遇到了同样的问题并得出了相同的解决方案。这肯定是 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
}
}
});
这不是错误,而是 Ember Data 中的设计选择。
JSONSerializer.serializeHasMany 方法并非按设计序列化 manyToOne;通常外键被持久化在关系的 belongsTo 端,而 hasOne 可能不会持久化外键
这篇文章中解释了一种解决方法:http ://www.toptal.com/emberjs/a-thorough-guide-to-ember-data请参阅“一对多和多对一关系”部分hack 是为了强制 DS.hasMany ID 也被序列化,您可以使用 Embedded Records Mixin。像这样attrs: {someRelationship: {serialize: 'ids'}}
现在 DS.RelationshipChange 已被删除。您应该像这样使用record.constructor:
record.constructor.determineRelationshipType(relationship)
显示您的关系类型。