web-dev-qa-db-ja.com

backbone.js ajaxリクエストのグローバルエラーハンドラー

バックボーン.jsによって実行されるajaxリクエストに対して1つのエラーハンドラーをバインドする方法はありますか?

私の状況:いつでも401(無許可)を取得できるので、ログインポップアップを表示する必要があります。

36
Plastic Rabbit

これにはjQueryを直接使用します。

$(document).ajaxError(function (e, xhr, options) {
  // do your stuff
});

Railsの例(ajaxSendを使用)で)CSRFに対して同じことを行うことができます。

詳細については、こちらをご覧ください: http://api.jquery.com/jQuery.ajax#advanced-options

24
Julien

バックボーンの同期は、エラーが発生したときに「エラー」イベントをトリガーします。したがって、取れるアプローチの1つは、BackboneのModelオブジェクトとCollectionオブジェクトを拡張して、これらのアドオンエラーチェックを追加することです。次のようになります。

ErrorHandlingModel = Backbone.Model.extend({

    initialize: function(attributes, options) {
        options || (options = {});
        this.bind("error", this.defaultErrorHandler);
        this.init && this.init(attributes, options);
    },

    defaultErrorHandler: function(model, error) {
        if (error.status == 401 || error.status == 403) {
            // trigger event or route to login here.
        }
    }

});

OtherModel = ErrorHandlingModel.extend({
});

そして、Collectionオブジェクトに対しても同様のことを行います。私は上記をテストしていませんが、かなり近いと思います。明らかに、より適切なクラス名を選択します。 initメソッドは、サブクラスが独自の初期化を行う機会を得るだけです。

25
Bill Eisenhauer

私が見つけたのは、おそらくバックボーンの「最も正しい方法」です。

var GeneralErrorView = Backbone.View.extend({
  events: {
    'ajaxError': 'handleAjaxError'
  },
  handleAjaxError: function (event, request, settings, thrownError) {
    //...handling goes here
  }
});

this.view = GeneralErrorView({el: document});

モデルまたはコレクションを拡張せずに、エラー処理ロジックを配置できます。ハンドラー内のBackbone.Eventsを利用して、他のエラーハンドラーなどにメッセージを送信します。

15
Vytautas Butkus

これはjQuery .ajaxSetupメソッドで処理できます。同じ状況(いつでも401エラーが発生する可能性のあるバックボーンアプリ)があり、アプリのエントリポイントでjQueryのajaxSetupを使用して処理します。

var appView = new AppView(options);

$.ajaxSetup({
    cache: false,
    statusCode: {
        401: function () {
            appView.signIn();
        }
    }
});

appView.render();

Backbone.history.start({ root: config.rootUrl, pushState: true });

このアプローチにより、バックボーン基本クラスを拡張する必要なしにグローバルエラー処理が可能になります。

10
Henry Wilson