質問

私はコレクションを持っていて、私はそのモデルの多くを変更しました。単一のHTTPリクエストを使用してすべての変更を保存する最善の方法は何ですか?

役に立ちましたか?

解決

通常、RESTバックシンドをシングルインスタンス作成/更新を処理します。オブジェクトの配列を受け入れるように変更する必要があります。

は、クライアント側では、Backbone.sync関数に直接行く必要があります。

Backbone.sync = function(method, model, options)
.

この場合、モデルはモデルの配列であるべきです。この方法は「作成」または「保存」になり、オプションはjQuery Ajax呼び出し(エラー、成功など)と同じタイプのオプションを取ります。

他のヒント

ここで間違ったことをやり、ウィキペディア適切なRestful Practices put example.com/resourcesに置き換えると、コレクション全体を別のコレクションに置き換える必要があります。これに基づいて、複数の項目の編集を同時にサポートしなければならなかったとき、私たちはこの契約を書きました。

  1. クライアントは{"resources": [{resource1},{resource2}]} を送信します。
  2. サーバーは、コレクション全体をクライアントからの新しい情報に置き換え、その情報を永続化された後に返します.{"resources": [{"id":1,...},{"id":2,...}]}

    契約のサーバーの半分をレールで書いたが、ここにクライアントの半分(CoffeeScript、申し訳ありません):

    class ChildElementCollection extends Backbone.Collection
      initialize: ->
        @bind 'add', (model) -> model.set('parent_id', @parent.id)
    
      url: -> "#{@parent.url()}/resources" # let's say that @parent.url() == '/parent/1'
      save: ->
        response = Backbone.sync('update', @, url: @url(), contentType: 'application/json', data: JSON.stringify(children: @toJSON()))
        response.done (models) => @reset models.resources
    
    .

    私はこれが実装が簡単で、backbone.syncをオーバーライドするのが簡単だと思いました。コードについての1つのコメント、私たちのコレクションは常に子オブジェクトでした。変更するルートレベルのコレクションがある場合は、@parentビジネスを削除するだけです。

Backbone.Collectionを拡張する必要があり、それぞれのモデルsave()を確認するhasChanged()メソッドを指定します。

それはBackbone.syncを呼び出すべきです。これは、おそらくカスタム同期関数に少し拡張する必要があるでしょう。カスタムBackbone.sync関数を使用している場合は、必ずコレクションに設定してください。

var CollectionSync = function(method, model, [options]) {
    // do similar things to Backbone.sync
}

var MyCollection = Backbone.Collection.extend({
    sync: CollectionSync,
    model: MyModel,
    getChanged: function() {
        // return a list of models that have changed by checking hasChanged()
    },
    save: function(attributes, options) {
        // do similar things as Model.save
    }
});
.

異なるアプローチ(コレクションを表すモデルを使用して)はここにあります。" "" "" "" "" "Backbone.js - backbone.syncまたはjquery.ajax?

私は https://stackoverflow.com/a/a/7986982/137067

このコードは、変更されたモデルの保存方法を呼び出すためだけに、コレクションプロトタイプに新しいメソッドを追加します。それは私のために働きました:

Backbone.Collection.prototype.saveAll = function(options) {
 return $.when.apply($, _.map(this.models, function(m) {
   return m.hasChanged() ? m.save(null, options).then(_.identity) : m;
 }));
};
.

gistリンク: https://gist.github.com/julianitor/701c677279bac1529b88

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top