使用hasmany保存商店并属于关系

时间:2015-06-12 17:31:34

标签: ember.js ember-data

我有一个带有“行”和“列”模型的商店(html中的tr和td),按钮将行和列添加到行中。 我只想在按下“保存”按钮时将更改保存到服务器。

此时已经完成了这段代码,它几乎可以工作,但是我的“保存”方法有些问题: 行和列的“id”在保存时来自服务器,但是当保存一行时,它不知道所有列的id和visversa。因此,save方法有问题且代码根本不好。

我想和Ember一起,当然有更好的方法吗?,谢谢你,如果你能给我一些帮助。 也许在我的addRow和addColumn方法中可以做得更好吗?

Ember 1.11 with restAdapter

App.IndexRoute = Ember.Route.extend({
    model: function () {
        return this.store.find('row');
    },
    setupController: function(controller, model) {
        controller.set('model', model);
    }
});

App.Row = DS.Model.extend({
    titre: DS.attr('string'),
    columns:  DS.hasMany('column', {async: true, embedded: 'always'}),
});
App.Column = DS.Model.extend({
    titre: DS.attr('string'),
    row: DS.belongsTo('row', {async: true}),
});

App.RowSerializer = DS.RESTSerializer.extend({   
    serializeHasMany: function(record, json, relationship) {    
        var hasManyRecords, key;
        key = relationship.key;
        hasManyRecords = Ember.get(record, key);
        if (hasManyRecords && relationship.options.embedded === "always") {    
            json[key] = [];
            hasManyRecords.forEach(function(item, index) {        
                json[key].push(item.get('id'));
            });
        }else{      
            this._super(record, json, relationship);
        }   
    } 
});

App.IndexController = Ember.Controller.extend({
    selectedColumn: null,

    actions: {
        save: function(){
            var row  = this.store.all('row');
            row.forEach(function(r, index, self){
                r.save().then(function(r2){
                    r2.get('columns').forEach(function(c){
                        c.set('row',r2);
                        c.save().then(function(){
                            r.save();
                        })
                    })
                })
            })
        },
        clickCol: function(column){
            this.set('selectedColumn', column)
        },
        addRow: function(){
            _this = this;
            var newRow = _this.store.createRecord('row',{titre:'Titre row'});
            var newColumn = _this.store.createRecord('column', {
                titre: 'Titre colonne',
            })
            newRow.get('columns').addObject(newColumn);
        },
        addColumn: function(){
            _this = this;
            this.get('selectedColumn').get('row').then(function(r){
                var newColumn = _this.store.createRecord('column', {
                    titre: 'Titre colonne',
                    row: r
                })
            })
        }
    }
})

编辑

我确实发现了这个: DS.RESTAdapter: Robust Support for Parent->Child Hierarchies 其中有其他写入:“允许父和子记录保存在同一个提交中”,“[RESTAdapter]允许新父,子一次保存”... 女巫似乎是我正在寻找的东西,但在任何地方找不到如何让它发挥作用?

也是这样的: Client-Side IDs with Ember Data 女巫说“考虑用户创建带有多个附件的帖子的情况。在尝试保存子模型以保持这种关系之前,您需要确保保存帖子并解析其ID”......

0 个答案:

没有答案