У меня есть система сообщений, которая имеет два метода: show
и clear
. Я хочу использовать $ http-перехватчики для обработки аутентификации, потому что мой сервер достаточно умен, чтобы узнать, аутентифицирован ли пользователь или нет, и скажет мне, отправив мне ответ на состояние 401
или 403
. Итак, у меня есть что-то подобное для моего перехватчика:Глобальная служба сообщений и аутентификация AngularJs
myModule.factory('statusInterceptor', function($location, MessageService, urlManager){
return {
responseError: function(response){
switch(response.status){
...
case 401:
case 403:
$location.url(urlManager.reverse('Login'));
MessageService.show('Dude, you need to log in first.');
break;
case 500:
break;
...
}
return response;
}
};
});
Это работает просто отлично либо на 401
или 403
ответ, как это показывает сообщение, как ожидалось. Проблема, с которой я столкнулась, - очищать сообщение, когда пользователь входит в систему или переходит на другой маршрут. У меня есть MainCtrl
, который отвечает за почти все, и одна из вещей, за которыми он заботится, - $routeChangeStart
. Я думал, что представление меняется на другое представление, поэтому я хочу очистить сообщения в начале маршрутного переключателя. Так, в моем MainCtrl
у меня есть:
myControllers.controller('MainCtrl', function($scope, MessageService){
$scope.$on('$routeChangeStart', function(){
MessageService.clear();
});
});
Вот как я ожидаю, что приложение реагирует:
- Пользователь пытался сделать что-то без проверки подлинности, отправив запрос на сервер
- Сервер отвечает либо
401
, либо403
, поскольку пользователь не аутентифицирован. - У меня есть функция
responseError
, вызывающая мой метод$location.url()
, который, на мой взгляд, должен стрелять$routeChangeStart
или даже$locationChangeStart
, события (я пробовал оба).- Это должно в свою очередь запустить мой метод
MessageService.clear()
и удалить все предыдущее сообщение.
- Это должно в свою очередь запустить мой метод
- Пользователь, наконец, перенаправляется на страницу входа с правильным сообщением
"Dude, you need to log in first."
.
Что происходит на самом деле:
Пользователь перенаправляется на страницу входа в систему, как и ожидалось, однако, сообщение об ошибке не отображается. При настройке определенных точек отладки в Chrome я вижу, что сразу вызывается $location.path()
, а затем MessageService.show('Dude...')
, после чего следует звонок MessageService.clear()
.
Мне нравится использование в $ д обещании. Я не знал, что вы можете использовать его для чего-либо другого, кроме событий запроса/ответа. Итак, $ q - это просто более простой способ сделать обратные вызовы? – OozeMeister
да :) ознакомьтесь с документацией – kfis