バックボーン.jsによって実行されるajaxリクエストに対して1つのエラーハンドラーをバインドする方法はありますか?
私の状況:いつでも401(無許可)を取得できるので、ログインポップアップを表示する必要があります。
これにはjQueryを直接使用します。
$(document).ajaxError(function (e, xhr, options) {
// do your stuff
});
Railsの例(ajaxSendを使用)で)CSRFに対して同じことを行うことができます。
詳細については、こちらをご覧ください: http://api.jquery.com/jQuery.ajax#advanced-options
バックボーンの同期は、エラーが発生したときに「エラー」イベントをトリガーします。したがって、取れるアプローチの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メソッドは、サブクラスが独自の初期化を行う機会を得るだけです。
私が見つけたのは、おそらくバックボーンの「最も正しい方法」です。
var GeneralErrorView = Backbone.View.extend({
events: {
'ajaxError': 'handleAjaxError'
},
handleAjaxError: function (event, request, settings, thrownError) {
//...handling goes here
}
});
this.view = GeneralErrorView({el: document});
モデルまたはコレクションを拡張せずに、エラー処理ロジックを配置できます。ハンドラー内のBackbone.Eventsを利用して、他のエラーハンドラーなどにメッセージを送信します。
これは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 });
このアプローチにより、バックボーン基本クラスを拡張する必要なしにグローバルエラー処理が可能になります。