我知道这个主题已经在stackoverflow和其他论坛上发布了,但我找不到确切的答案。
单个记录创建和提交与createRecord和保存功能一起正常工作。如何创建批量记录并将其提交给服务器?我正在使用JSONAPI适配器。
我在讨论中读过一种方法是创建一个自定义适配器,但我不确定这样做的正确位置...也许创建saveAllRecords()函数或另一种方法是使用pushpayload。
提前致谢。
答案 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);"
}
}
}
}
});