11

バックグラウンド:

バックボーンモデルには、サーバーへの呼び出しが失敗するたびに呼び出されるフォールバックエラーハンドラーを登録するオプションがあり、特定のハンドラーは提供されません。

MyModel = new Backbone.Model.extend({
  initialize: function(option) {
    this.on("error", this.fallbackErrorHandler);
  },

  fallbackErrorHandler: function() {
    // default behavior in case of an error
  },

  foo: function() {
    this.fetch();             // fallbackErrorHandler will be called
    this.fetch({              // the inline error handler will be called
      error: function() {
        // some specific code for this error
      }
    });
  }    
});

私がやりたいこと:

アプリケーションのすべてのバックボーンモデルにフォールバックエラーハンドラーを持たせたいです。ただし、モデルごとにハンドラーを明示的に追加したくありません。 ハンドラーを一度定義して登録し、アプリケーションの各バックボーンモデルに適用したいと思います。さらに、既存のコードを変更したり、開発者がアプリケーションでモデルを定義する方法を変更したりしたくありません。

私がすでに試したこと:

Backbone.Model.prototypeオブジェクトにハンドラーを登録するイニシャライザーを追加しました。

App.Marionette.addInitializer(function() {
  Backbone.Model.prototype.on("error",function(){
     // default behavior in case of an error
  });
});

このコードは機能し、フォールバックエラーハンドラーが呼び出されました。ただし、このコードの副作用は、アプリケーションのバックボーンモデルに登録されているすべてのエラーハンドラーが、Backbone.ModelではなくBackbone.Model.prototypeに登録されていることでした。したがって、明らかにこれは良い解決策ではありません。

また、 Backbone.Modelを拡張し、デフォルトのハンドラーを登録するMyModelを定義することも考えました。アプリケーション内の他のすべてのモデルは、Backbone.Modelを直接拡張するのではなく、MyModelを拡張します。ただし、既存のコードを変更せずにシームレスにこれを作成し、すべての開発者にBackbone.ModelではなくMyModelを拡張するように指示しています。

誰かがこの問題の解決策を持っていますか?

4

1 に答える 1

6

バックボーンはデフォルトでjQueryのAJAXメソッド呼び出しを使用します。バックボーンを使用する代わりに、これに直接接続できます。

http://api.jquery.com/ajaxError/

それでも目的が得られない場合は、Backboneのモデルの「fetch」メソッドをオーバーライドできます。


var originalFetch = Backbone.Model.prototype.fetch;

Backbone.Model.prototype.fetch = function(options){

  var originalError = options.error;

  options.error = function(model, error){
    if (originalError){ originalError(model, error); }

    // call your global error handler here.
    App.myGlobalErrorHandler(model, error);

  }

  originalFetch.apply(this, arguments);
};
于 2012-12-02T20:02:08.897 に答える