Backbone.syncをオーバーライドする方法は?


145

私はBackbone.jsを試していますが、試みていることの1つはリモートAPIを呼び出すことです。そのため、ドキュメントを理解しているので、Backbone.syncをオーバーライドできる必要があります

ドキュメント自体にその方法の例はありません。また、Backboneのgoogleグループはないようです...誰かがこれを行う例を指摘できますか?


4
Googleグループがない場合は、freenodeの#documentcloudルームをチェックして、そこで質問してください。答えが得られた場合は、必ずここに戻って自分の質問に答えてください。たくさんの素晴らしい議論があり、それを体系化してあなたの後に来る人たちのために検索できるようにしておくのはいいことです。
Andrew De Andrade

回答:


225

この注釈付きソースの例を見てください。これらBackbone.syncはlocalstorageの代替で上書きされています。

backbone-localStorage

基本的に、Backbone.syncは4つの引数を取る関数である必要があります。

Backbone.sync = function(method, model, options) { };

あなたは火のいずれかに必要があるoptions.successoptions.errorかどうかに応じてmethod成功しました。メソッドの形式は次のとおりです。

  • "create" :サーバー上にモデルを作成することが期待されています
  • "read" :サーバーからこのモデルを読み取って返すことが期待されています
  • "update" :サーバー上のモデルを引数で更新することが期待されています
  • "delete" :サーバーからモデルを削除する必要があります。

これらの4つのメソッドを実装し、必要なものを定義する必要があります "server"

もちろん、これらは実装するBackbone.sync 必要があるものだけです。より多くmethodsを実装し、より多くのパラメーターを渡すことができますがsuccess、これを行わないことが最善です。

Backbone.sync現在と同じように動作することを確認して、実装ではなくインターフェイスへのプログラミングを行うことをお勧めします。変更さBackbone.syncれたlocalStorageを変更する場合は、拡張されたBackbone.syncと一致するように自分で拡張する必要はありません。

[編集]

また、の複数の実装を使用できることに注意してくださいsync。へのすべての参照Backbone.syncは実際に行われる(this.sync || Backbone.sync)ため、次のようなことを行う必要があります。

var MyModel = Backbone.Model.extend({ 
    ...

    "sync": myOwnSpecificSync,

    ...
});

Backbone.syncモデルにsyncメソッドが明確に設定されていない限り、すべてのモデルが使用するデフォルトのグローバルグローバルです。


2
モデルがlocalStorageからフェッチし、別のモデルがサーバーからフェッチする場合はどうなりますか?それはまだ可能ですか?
ピカルド

19
(this.sync || Backbone.sync)編集を参照してください。さらなるヒントは、バックボーンの注釈付きソースを読むことです。すべて揃っています!
レイノス2011

3
[編集]後の、各モデルに独自の同期がある詳細は非常に重要です!ありがとう!
アベル

26
特定のモデルの同期メソッドをオーバーライドできることを言及するための+1。
Chetan 2011

12
もう1つだけ追加syncします。コードの任意の場所(通常は上書きされたものsync)から「デフォルト」を呼び出したい場合は、を実行するだけですBackbone.sync.call(this, method, this, options)
非対称

15

私はこの答えが少し遅すぎて、@ Raynosからの答えが素晴らしいことを知っていますが、少し違う方法でやったので、あなたや他の人がバックボーンでAPIを使用しようとする場合に役立つでしょう。

代わりにBackbone.syncをオーバーライドする、私はオーバーライドBackbone.ajaxを AJAX要求が行われる場合、それはだから、。

次に例を示します。

// Set the default implementation of `Backbone.ajax` to proxy through to `$`.
Backbone.ajax = function() {
    var args = Array.prototype.slice.call(arguments, 0);

    // Here, I add the OAuth token (or any other token)
    // But before, I check that data exists, if not I add it
    if (args[0]['data'] === undefined) {
        args[0]['data'] = {};
    }
    args[0]['data']['token'] = 'any_api_token_here';

    return Backbone.$.ajax.apply(Backbone.$, args);
};

11

sync特定の属性のみを同期する必要がある場合は、通常、バックボーンのメソッドをオーバーライドする必要があります。典型的な実装は次のようになります。

sync: function (method, model, options) {
  options.data = _.pick(this.attributes, 'foo', 'bar', 'baz');
  return Backbone.sync.call(this, method, model, options);
}

そしてそれはモデルまたはコレクションに入ります。
Gabe Rainbow

3
マイナーな提案:最後の行をに変更するのはBackbone.sync.apply(this, arguments);どうですか?たとえば、オーバーライドされたバージョンので「options」引数を省略した場合、それは少し柔軟になりますsync
Lochlan

この質問の将来のファインダのための何か他のもの:Backbone.syncを返すことを確認してア・ラ・backbonejs.org/docs/backbone.html#section-62
Lochlan

1
を使用Backbone.model.save(attributes, {patch: true})して、部分更新を今すぐ実行できます
roborourke
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.