在Ember 2.2

时间:2016-09-02 09:39:36

标签: ember.js

我知道这个主题已经在stackoverflow和其他论坛上发布了,但我找不到确切的答案。

单个记录创建和提交与createRecord和保存功能一起正常工作。如何创建批量记录并将其提交给服务器?我正在使用JSONAPI适配器。

我在讨论中读过一种方法是创建一个自定义适配器,但我不确定这样做的正确位置...也许创建saveAllRecords()函数或另一种方法是使用pushpayload。

提前致谢。

5 个答案:

答案 0 :(得分:2)

我建议使用promise数组,如下所示(因为.save()返回一个promise):

let jobs = items.map(item => item.save());

Promise.all(jobs).then(items => {
    // Do whatever
});

答案 1 :(得分:1)

我参加派对有点晚了,但你可以做到以下几点。

创建一个具有属性modelList的新模型,该模型将包含您要保存的所有模型。

import DS from 'ember-data';

export default DS.Model.extend({
    modelList: DS.hasMany('model')
});

您需要创建自定义序列化程序并使用EmbeddedRecordsMixin。

import DS from 'ember-data';
import Ember from 'ember';

export default DS.JSONAPISerializer.extend(DS.EmbeddedRecordsMixin,{
    attrs: {
        participants: {
            embedded: 'always'
        }
    }
});

在您的路线/控制器中创建新模型并填写列表。

let modelList = this.store.createRecord('model-list', {modelList: [obj1, obj2, obj3]});

您可以使用以下命令保存modelList对象:

modelList.save()

这将包括有效负载中的所有模型,并将它们发送到您的后端,您可以在其中访问列表并单独保护它们。

答案 2 :(得分:0)

你可以这样做:

let obj1 = this.get('store').createRecord('model', {/*values*/});
let obj2 = this.get('store').createRecord('model', {/*values*/});
let obj3 = this.get('store').createRecord('model', {/*values*/});

...

unsavedRecord: Ember.computed(function({
  return this.get('store').peekAll('model').filterBy('isNew', true);
}))

...

actions: {
  save(){
  this.get('unsavedRecord').forEach(function(model){
  model.save();
});
}
}

答案 3 :(得分:0)

您可以创建一个自定义适配器,但它将是一个肮脏的解决方案,我不知道如何使用给定的方法在那里使用多个对象。

如果您的模型不太复杂,我希望您将自定义有效负载发送到您的服务器。

我使用它来为列表发送简单的位置更新,该列表可由用户排序。我原来的模型很大,有30多个属性和关系。这样我就可以立即发送所有位置更新。

就像它看起来像这样。

var simplified_modules = [];

forEach(...){
    var simple = {
              id: entity.get('id'),
              position: entity.get('newPosition')
             };

    simplified_modules.addObject(simple);
}

Ember.$.ajax(Hosturl + "/lists/update_positions, {
        type: 'POST',
        data: JSON.stringify({
            updated_module_positions: simplified_modules
        }),
        contentType: 'application/json',
        .......
    });

答案 4 :(得分:0)

我看到的唯一解决方案是重新打开Ember.Array课程并定义一个属性' saveAll',它将具有大致此类内容:

Ember.Array.reopen({
    saveAll: function () {
        if (this.length) {
            var serializedObject = {}; //
            this.forEach(function (element) {
                if (element.save) {
                    //TODO: 1) serialize element and push it to
                    //the serializedObject
                    //2) then you can manually make ajax call or
                    //make a method inside you adapter, and call it
                    //from here like this: "adapter.customSave(data);"
                }
            }
        }
    }
});