Глобальный обработчик ошибок для ajax-запросов backbone.js - PullRequest
36 голосов
/ 27 мая 2011

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

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

Ответы [ 4 ]

25 голосов
/ 27 мая 2011

Синхронизация Backbone вызывает событие «error» при возникновении ошибок.Поэтому вы можете использовать один из подходов - расширить объекты Model и Collection в Backbone, чтобы добавить эти дополнительные проверки ошибок.Это будет выглядеть примерно так:

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

24 голосов
/ 27 мая 2011

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

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

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

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

15 голосов
/ 25 июня 2013

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

10 голосов
/ 14 ноября 2013

Вы можете справиться с этим с помощью метода jQuery .ajaxSetup. У нас идентичная ситуация (базовое приложение, которое может получить ошибку 401 в любое время), и мы обрабатываем ее с помощью jjuery 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...