0

Я использую $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 истинно).

+1

Вы пробовали обернуть свою функцию «responseError» в службе, у которой есть флаг, чтобы проверить, действительно ли модальный был отображен уже или нет? – XelharK

+0

еще нет. Я сейчас пытаюсь хранить «modalopen» в localstorage и проверять это в цикле foreach. Не уверен, что этот метод будет работать. Я обновлю, если мне повезло. – Neel

+0

@XelharK Я думаю, что хранить в '$ rootScope' лучше, чем хранить в' localStorage'. Принимая ваше предложение, я подумал, что могу использовать '$ rootScope' в качестве переключателя, установив' $ rootScope.loginProgress' как истинный, когда модальный открывается, и последовательные модалы проверяют это, прежде чем принимать решение об открытии модального или нет. Однако я не уверен, как вернуть пустое обещание перехватчику, когда '$ rootScope.loginProgress' истинно. Я обновил свой вопрос с помощью моей попытки сервиса. Можете ли вы помочь мне в том, как я могу продолжить здесь, пожалуйста? – Neel

ответ

0

Чтобы преодолеть мою проблему, я теперь использую перехватчик http-auth-interceptor, а затем меняю $rootScope.loginProgress на основании открытого состояния входа в систему. Последовательные модалы, которые открываются из-за нескольких 401, будут проверять этот статус модальности входа, а затем решают открыть модальный или нет. Используя http-auth-interceptor, я могу добавить переключатель, наблюдая за 'event:auth-loginRequired'. Вот код, я использую:

scope.$on('event:auth-loginRequired', function() {  
      if(!$rootScope.loginProgress) { 
         $rootScope.loginProgress = true; 
         LoginModalService() 
          .then(function() { 
           authService.loginConfirmed(); 
            $rootScope.loginProgress = false; 
          }) 
          .catch(function() { 
           authService.loginCancelled(); 
            $rootScope.loginProgress = false; 
          }); 
      } 
}); 

Где LoginModalService() это сервис, который открывает для входа модальность.

Смежные вопросы