Ember数据:模型和hasMany子模型不会持久化

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关系并重新保存容器,最后使子模型属于容器并保存子模型又来了吗?

Poo*_*avi 6

问题

默认情况下,序列化时DS.hasMany,一对多关联不会包含ids字段.您可以使用它DS.EmbeddedRecordsMixin来更改此行为.

更多信息

有关更多信息,请阅读"Ember数据全面指南"中的Embedded Records Mixin部分.(免责声明,我是它的作者.)

这是一段摘录

DS.EmbeddedRecordsMixin是一个扩展DS.ActiveModelSerializer,允许配置关联如何序列化或反序列化.虽然尚未完成(特别是关于多态关联),但它仍然很有趣.

你可以选择:

  • 不要序列化或反序列化关联.
  • 序列化或反序列化与id或id的关联.
  • 序列化或反序列化与嵌入式模型的关联.

代码示例:

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)