EXTJS 4 — Глобальный прослушиватель исключений

#javascript #extjs #extjs4 #extjs-mvc

#javascript #extjs #extjs4 #extjs-mvc

Вопрос:

У меня есть ситуация, когда я делаю ajax запросы к серверу из разных Ext gridpanel и т.д. В области администратора.

Вошедший в систему пользователь будет выведен из системы, если не будет активности, например, в течение 5 минут, что является нормальным.

В этом случае сервер отправляет обратно перенаправление 403 на страницу входа.

Прямо сейчас я вставляю:

 listeners: {
    exception: function(proxy, response, operation, eOpts) {
        if (response.status == '403')
            window.location = 'login';
    }
}
  

Для каждого store's прокси, что немного излишне.

Не мог бы кто-нибудь быть достаточно любезным и сообщить мне, как я мог бы добавить прослушиватель ко всем сообщениям между ExtJS и сервером?

Я использую архитектуру приложения MVC, поэтому, вероятно, это может быть однострочник в controller.js или app.js .

Спасибо

Ответ №1:

В начале вашего приложения вставьте следующий фрагмент. При этом КАЖДЫЙ ответ, будь то из хранилища, формы или …, будет проверен и перенаправлен на страницу входа.

 Ext.Ajax.on('requestexception', function (conn, response, options) {
    if (response.status === 403) {
        window.location = 'login';
    }
});
  

Комментарии:

1. забавно, мы оба отвечали на этот вопрос одновременно, и оба дали один и тот же ответ. Так что это должно быть правильно.

2. В яблочко! Большое вам спасибо

Ответ №2:

Я не совсем уверен, что это будет перехватывать все запросы ajax, но предполагая, что вы используете AjaxProxy для всех сообщений с сервером, это должно сработать: обработайте событие ‘requestexception’ во внешнем.Ajax singleton что-то вроде этого

 Ext.Ajax.on('requestexception', function(conn, response, options, eOpts) {
    //your error handling here
});
  

Я не пробовал, но если вы это сделаете, не могли бы вы опубликовать обновление здесь?

Ответ №3:

Более полное решение, в котором оно будет универсальным, заключается в следующем:

 Ext.util.Observable.observe(Ext.data.Connection, {
    requestexception: function(conn, response, options) {
        if(response.status == '403')
            window.location = 'login';
    }
});
  

Это связано с тем, что базовый класс Ext.data.Connection используется не только в Ext.Ajax , но и Ext.data.Proxy который используется Ext.data.Store, Ext.data.Model . Это обрабатывает исключения при таких вызовах, как store.load() и model.save() . Это должен быть более полный универсальный обработчик.

Смотрите больше деталей в моем сообщении в блоге.

Комментарии:

1. Ext.util. Observable.observe не является функцией в Ext JS 5.x. Вы должны использовать Ext.Ajax.on

2. Нет, вы этого не делаете, и да, в Ext JS 5.0.1 typeof Ext.util.Observable.observe будут выводиться "function"