Ember.js 为什么是“a”;“多通”;在余烬数据中序列化时,关系的处理方式是否不同?
我的问题与“”高度相关,但我不关心嵌入-我只想要一个工作的一对一(双向)关系。以以下模型为例:Ember.js 为什么是“a”;“多通”;在余烬数据中序列化时,关系的处理方式是否不同?,ember.js,ember-data,Ember.js,Ember Data,我的问题与“”高度相关,但我不关心嵌入-我只想要一个工作的一对一(双向)关系。以以下模型为例: App.Child = DS.Model.extend({ name: DS.attr('string'), toys: DS.hasMany('toy'), }); App.Toy = DS.Model.extend({ name: DS.attr('string'), child: DS.belongsTo('child') }); 并创建/保存以下对象: var
App.Child = DS.Model.extend({
name: DS.attr('string'),
toys: DS.hasMany('toy'),
});
App.Toy = DS.Model.extend({
name: DS.attr('string'),
child: DS.belongsTo('child')
});
并创建/保存以下对象:
var store = this.get('store');
store.createRecord('child', {name: 'Herbert'}).save().then(child => {
return store.createRecord('toy', {name: 'Kazoo', child: child}).save())
}).then(toy => {
child.get('toys').pushObject(toy);
return child.save();
});
我希望孩子在序列化时引用玩具。比如说
{
'name': 'Herbert',
'toys': [ 1 ]
}
但事实并非如此。因为这是一种“多通”关系,而且余烬数据不会序列化这些关系:
如果通过删除belongs使其成为manytone关系,它将起作用,但会丢失back引用
为什么会有这种特殊行为?为什么许多人与许多人或许多人不同,应该得到如此特殊的待遇
这种行为记录在哪里?我完全忽略了它,并认为这是我正在使用的序列化程序/适配器中的一个bug
实现所需序列化的正确方法是什么?我最终创建了自己的、经过简单修改的序列化程序:
import EmberPouch from 'ember-pouch';
export default EmberPouch.Serializer.extend({
serializeHasMany: function(snapshot, json, relationship) {
// make sure hasMany relationships are serialized.
// http://stackoverflow.com/questions/20714858/ember-data-saving-relationships
var key = relationship.key;
if (this._canSerialize(key)) {
var payloadKey;
// if provided, use the mapping provided by `attrs` in
// the serializer
payloadKey = this._getMappedKey(key);
if (payloadKey === key && this.keyForRelationship) {
payloadKey = this.keyForRelationship(key, "hasMany", "serialize");
}
var relationshipType = snapshot.type.determineRelationshipType(relationship);
if (relationshipType === 'manyToNone' || relationshipType === 'manyToMany' || relationshipType === "manyToOne") {
json[payloadKey] = snapshot.hasMany(key, { ids: true });
// TODO support for polymorphic manyToNone and manyToMany relationships
}
}
},
});
主要区别在于它也接受多个关系
并在application/adapter.js中使用它:
export default EmberPouch.Adapter.extend({
defaultSerializer: "pouchserial",
....
在这种特定的(小袋)情况下,最好只在子对象上存储对父对象的引用,这样在添加子对象时父对象就不需要更新(这也避免了冲突) 为什么要第二次救孩子?第一次保存玩具会给它一个外键,而且ember data的存储是唯一的真实来源,因此所有客户关系都会起作用。然后,您应该返回第二个
。然后和链承诺,而不是嵌套第二次保存是保存添加的玩具,而不是保留任何差异,属性保持为空(这就是我问题的重点)。关于嵌套和链接承诺,你是对的,但这对最终结果没有影响。也许更好的问题是,你想实现什么?为什么你想让孩子用一系列玩具ID进行序列化?