Подтвердить что ты не робот

Глобальный обработчик ошибок для запросов ajax для backbone.js

Есть ли способ связать один обработчик ошибок для запросов ajax, выполняемых backbone.js?

Моя ситуация: я могу получить 401 (неавторизованный) в любое время, поэтому мне нужно показать всплывающее окно входа.

4b9b3361

Ответ 1

Используйте jQuery непосредственно для этого.

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

Вы можете сделать то же самое для CSRF в рельсах для примера (используя ajaxSend).

Вы можете прочитать больше здесь: http://api.jquery.com/jQuery.ajax#advanced-options

Ответ 2

Базовая синхронизация запускает событие "ошибка" при возникновении ошибок. Таким образом, одним из способов, который вы можете предпринять, является расширение объектов 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 просто позволяет подклассам получить возможность выполнить собственную инициализацию.

Ответ 3

То, что я нашел, возможно, является "самым правильным способом" в Backbone:

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

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

Вы можете поместить любую логику обработки ошибок без расширения моделей или коллекций. Используйте Backbone.Events внутри обработчика и передавайте сообщения другим обработчикам ошибок или что-то в этом роде.

Ответ 4

Вы можете справиться с этим с помощью метода 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 });

Этот подход обеспечивает глобальную обработку ошибок без необходимости расширения базовых классов Backbone.