web-dev-qa-db-ja.com

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

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

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

145
picardo

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

backbone-localStorage

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

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

methodが成功したかどうかに応じて、options.successまたはoptions.errorを起動する必要があります。メソッドの形式は次のとおりです。

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

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

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

Backbone.syncが現在行っているのと同じことを確認して、実装ではなくインターフェースへのプログラミングを行うのが最善です。たとえば、localStorageのように変更したBackbone.syncを切り替えたい場合は、拡張したBackbone.syncに合わせて自分で拡張する必要はありません。

[編集]

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

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

    "sync": myOwnSpecificSync,

    ...
});

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

225
Raynos

私はこの答えが少し遅すぎることを知っており、@ Raynosからの答えは素晴らしいですが、私は少し違ったやり方をしました、そしてそれはあなたやBackboneで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);
};
15
Cyril N.

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

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