免责声明:我试图制作一个jsfiddle,但是如果没有RESTAdapter的公共资源,我就无法让它发挥作用。
我有一个带有hasMany子模型数组的模型。我需要为这个子数组添加一个新模型并保存到服务器:
App.FooModel = DS.Model.extend({
'name': DS.attr('string'),
'bars': DS.hasMany('App.BarModel')
});
App.BarModel = DS.Model.extend({
'name': DS.attr('string'),
});
App.ApplicationController = Ember.Controller.extend({
init: function() {
var foo = App.FooModel.find(101); // -- currently has bars[201, 202, 203]
var newBar = loadFixture( App.BarModel, 204 );
var self = this;
setTimeout( function() { // -- just to be sure our models are loaded before we try this
// foo.currentState: saved
foo.get('bars').addObject(newBar);
// foo.currentState: saved
foo.store.commit(); // -- nothing happens
}, 1000);
}
});
App = Ember.Application.create({
store: DS.Store.create({
revision: 11
})
});
但没有任何反应。我的父模型没有被标记为脏,因此商店从不尝试提交。是否有不同的方式我应该将这种关系添加到父母?这是一个错误吗?
当前解决方法:
foo.get('bars').addObject(newBar);
var save = foo.get('name');
foo.set('name', (save + '!'));
foo.set('name', save); // -- this marks our record as dirty, so a save will actually happen
foo.store.commit();
编辑1:我知道如果嵌入数据(https://stackoverflow.com/a/15145803/84762),ember-data将仅序列化此数据,但我已覆盖我的序列化程序来处理此数据。我遇到的问题是商店甚至都没有尝试保存这个更改,所以我们甚至都没有进入序列化器。
编辑2:我怀疑可能与this bug有关,但同样意味着这对任何人都不起作用我很难相信没有其他人遇到过这个问题。
答案 0 :(得分:1)
您似乎在建模一对多关系,但未在belongsTo
上添加App.BarModel
选项。检查此链接:
http://emberjs.com/guides/models/defining-models/#toc_one-to-many
App.Post = DS.Model.extend({
comments: DS.hasMany('App.Comment')
});
App.Comment = DS.Model.extend({
post: DS.belongsTo('App.Post')
});
答案 1 :(得分:0)
根据我的理解,您没有使用关系的embedded
功能,而是覆盖了序列化程序来处理bars
对象到foo
对象的序列化。
我认为您的错误可能来自此处:如果您的关系未嵌入,则没有理由将foo
对象标记为脏,因为向对象bars
添加对象时应更改的内容通常是您添加的foo_id
对象的密钥bar
,然后发送给API的foo
对象没有任何更改。