2016-09-02 13 views
1

この件名は既にstackoverflowや他のフォーラムの周りに掲載されていますが、まだ私は正確な答えを見つけることができません。Ember 2.2で一度に複数のレコードを保存する(バルクコミット)

単一レコードの作成とコミットは、createRecordとsave関数でうまくいきます。バルクレコードの作成にはどのようにしてサーバーにコミットするのですか?私はJSONAPIアダプタを使用しています。

私は、カスタムアダプタを作成する方法があると読んでいますが、それを行う正しい場所はわかりません。おそらくsaveAllRecords()関数や別の方法を作成するpushpayloadを使用する。

ありがとうございます。

答えて

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(); 
}); 
} 
} 
+0

ありがとうございました。 3つのレコードすべてを一度にプッシュしたいが、サーバーを3回呼び出すのではない。 – Jerry

+0

@ジェリーああ、あなたはアダプタで独自のメソッドを作成する必要があります –

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', 
     ....... 
    }); 
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);" 
       } 
      } 
     } 
    } 
}); 
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()