ans*_*sen 7 javascript ember.js ember-data ember-cli
我有一个类似于这个堆栈溢出问题的问题,除了答案似乎没有工作.我有一个表单,用户在其中创建一个包含可变数量子模型的容器模块.提交表单时,我必须保存容器,子模型,并确保hasMany关系仍然存在.我的代码(使用Ember-Cli):
容器:
var Container= DS.Model.extend({
name: DS.attr('string'),
submodels: DS.hasMany('submodel'),
lastModified: DS.attr('date')
});
export default Container;
Run Code Online (Sandbox Code Playgroud)
子模型:
var Submodel= DS.Model.extend({
char: DS.belongsTo('container'),
name: DS.attr('string'),
desc: DS.attr('string'),
priority: DS.attr('number'),
effort: DS.attr('number'),
time: DS.attr('number')
});
export default Submodel;
Run Code Online (Sandbox Code Playgroud)
ContainersNewRoute:
export default Ember.Route.extend({
model: function() {
return this.store.createRecord('container', {
...
});
}
});
Run Code Online (Sandbox Code Playgroud)
ContainersNewController:
export default Ember.ObjectController.extend({
actions: {
addSubmodel: function() {
var submodels= this.get('model.submodels');
submodels.addObject(this.store.createRecord('submodel', {
...
}));
},
saveNewContainer: function () {
var container = this.get('model');
container.save().then(function(){
var promises = Ember.A();
container.get('submodels').forEach(function(item){
promises.push(item.save);
console.log(item);
});
Ember.RSVP.Promise.all(promises).then(function(resolvedPromises){
alert('all saved');
});
});
this.transitionToRoute(...);
}
}
});
Run Code Online (Sandbox Code Playgroud)
Ember数据本身工作正常,转换到创建容器的视图,列出子模型.刷新页面,子模型从容器视图中消失.
我尝试了一些变体,例如使用pushObject而不是堆栈溢出答案中的addObject.我还尝试使用Ember.RSVP回调在保存子模型后第二次运行container.save().
经过一些进一步的测试,我发现子模型根本不存在.
是否有一种理智的方式来保存1)容器2)子模型3)hasMany/belongsTo彼此之间的关系?
或者这有些需要分解成离散步骤,我保存容器,保存子模型,将子模型推送到容器以获得hasMany关系并重新保存容器,最后使子模型属于容器并保存子模型又来了吗?
默认情况下,序列化时DS.hasMany,一对多关联不会包含ids字段.您可以使用它DS.EmbeddedRecordsMixin来更改此行为.
有关更多信息,请阅读"Ember数据全面指南"中的Embedded Records Mixin部分.(免责声明,我是它的作者.)
DS.EmbeddedRecordsMixin是一个扩展DS.ActiveModelSerializer,允许配置关联如何序列化或反序列化.虽然尚未完成(特别是关于多态关联),但它仍然很有趣.
你可以选择:
代码示例:
App.CartSerializer = DS.ActiveModelSerializer
.extend(DS.EmbeddedRecordsMixin)
.extend{
attrs: {
items: {serialize: 'ids', deserialize: 'ids'}
}
});
App.Cart = DS.Model.extend({
items: DS.hasMany('item', {async: true})
});
App.Item = DS.Model.extend({
cart: DS.belongsTo('item', {async: true})
});
Run Code Online (Sandbox Code Playgroud)