Я использую $http interceptor
, чтобы показать модем регистрации, когда $auth
не удается. Вот краткая настройка. У меня есть:
$provide.factory('modalWhenLoggedOut', ['$q', '$injector', '$rootScope',
function($q, $injector, $rootScope) {
return {
responseError: function(rejection) {
// $injector.get to fix circular dependency error
var loginModal = $injector.get('LoginModalService');
var $http = $injector.get('$http');
var $state = $injector.get('$state');
// Check for reasons instead of status code
var rejectionReasons = ['token_not_provided', 'token_expired', 'token_absent', 'token_invalid'];
// Loop through each rejection reason and redirect
angular.forEach(rejectionReasons, function(value, key) {
if(rejection.data.error === value) {
// Show the login modal
var deferred = $q.defer();
loginModal()
.then(function() {
deferred.resolve($http(rejection.config));
})
.catch(function() {
$state.go('index');
deferred.reject(rejection);
});
return deferred.promise;
}
});
return $q.reject(rejection);
}
}
}]);
// Push the new factory onto the $http interceptor array
$httpProvider.interceptors.push('modalWhenLoggedOut');
Приведенный выше код отлично работает. Но проблема заключается в том, когда api выдает множественную ошибку с ошибкой аутентификации, перехватчик одновременно открывает несколько модалов. Обычно на одной странице у меня может быть 2-3 раза различные службы, обращающиеся к backend api, и когда auth не удается, все эти api возвращают ошибку с ошибкой аутентификации во время недействительных токенов. Этот перехватчик подбирает его как 3 ошибки take_invalid и показывает 3 модальности входа 1 друг на друга. Как я могу это предотвратить?
Как я могу убедиться, что перехватчик показывает только 1 модем входа в систему независимо от того, сколько раз произошел сбой при авторизации?
My Service Похоже что-то вроде этого:
.service('LoginModalService', ['$modal', '$rootScope',
function($modal, $rootScope) {
function updateRootScope() {
$rootScope.loginProgress = false;
}
if ($rootScope.loginProgress = false) {
return function() {
var instance = $modal.open({
templateUrl: rootPath + 'views/partials/LoginModalTemplate.html',
controller: 'LoginModalCtrl'
})
return instance.result.then(updateRootScope);
};
}
}])
В службе я пытаюсь использовать $rootScope.loginProgress
как переключатель, чтобы выяснить, если Логин модальный открыт или нет. Тем не менее, я не уверен, как вернуть пустое обещание, если модальный уже открыт (когда $rootScope.loginProgress
истинно).
Вы пробовали обернуть свою функцию «responseError» в службе, у которой есть флаг, чтобы проверить, действительно ли модальный был отображен уже или нет? – XelharK
еще нет. Я сейчас пытаюсь хранить «modalopen» в localstorage и проверять это в цикле foreach. Не уверен, что этот метод будет работать. Я обновлю, если мне повезло. – Neel
@XelharK Я думаю, что хранить в '$ rootScope' лучше, чем хранить в' localStorage'. Принимая ваше предложение, я подумал, что могу использовать '$ rootScope' в качестве переключателя, установив' $ rootScope.loginProgress' как истинный, когда модальный открывается, и последовательные модалы проверяют это, прежде чем принимать решение об открытии модального или нет. Однако я не уверен, как вернуть пустое обещание перехватчику, когда '$ rootScope.loginProgress' истинно. Я обновил свой вопрос с помощью моей попытки сервиса. Можете ли вы помочь мне в том, как я могу продолжить здесь, пожалуйста? – Neel