2016-04-14 4 views
0

заводКак ввести область действия в httpInterceptor angularjs?

.factory('authHttpResponseInterceptor',['$q','$location','$rootScope',function($q,$location, $rootScope){ 
    return { 
     responseError: function(rejection) { 
      if (rejection.status === 401) { 
       console.error("Response 401 in interceptor "); 
       $('.modal-logout').modal({ 
        backdrop: 'static', 
        keyboard: false 
       }); 
       $('.modal-logout').modal('show'); 
      } 

      if (rejection.status === 403) { 
       console.error("Response 403 in interceptor"); 
       $scope.errorMessages.push("You are not authorized to perform this action."); 
      } 

      return $q.reject(rejection); 
     }, 

я хочу, чтобы впрыснуть $ объем здесь, чтобы отобразить сообщение об ошибке на 403, но я не в состоянии впрыснуть. Я хочу передать сообщение в мой массив errorMessage, который определен в контроллере. как я могу достичь того же.

ответ

0

По дизайну вы не можете вводить $ scope здесь. Howeer, что вы хотите сделать, конечно, возможно.

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

1 - создать службу, которая будет хранить и отображать сообщения в одиночку за пределами любого контроллера.

2 - Создайте службу, которая будет хранить сообщения и использовать $ scope. $ Watch в вашем контроллере, чтобы наблюдать за ними и обновлять ваше представление.

Сторона-перехватчик: if (rejection.status === 403) { console.error («Ответ 403 в перехватчике»); myService.errorMessages.push («У вас нет разрешения на выполнение этого действия»); сторона }

Контроллер:

$scope.$watchCollection(function(){ 
    return myService.errorMessages; 
}, 
function(){ 
    $scope.myMessages = angular.merge([], myService.errorMessages); 
    $timeout(function(){ 
     $scope.myMessages = []; 
    }, 3000); 

});

$ tiemout - это вы хотите очистить свои сообщения после 3-х случаев их высыпания, вам может и не понадобиться.

1-я функция в $ watchCollection - это наблюдаемое значение, второе - обратный вызов, когда он изменился.

+0

Thnx для быстрого ответа может у объяснить с примером будет полезно я очень новой для angularjs. –

0

Другой способ - использовать $ broadcast для отправки события активному контроллеру, где вы можете уловить эту ошибку HTTP и использовать соответственно.

.factory('authHttpResponseInterceptor',['$q','$location','$rootScope',function($q,$location, $rootScope){ 
return { 
    responseError: function(rejection) { 
     if (rejection.status === 401) { 
      console.error("Response 401 in interceptor "); 
      $('.modal-logout').modal({ 
       backdrop: 'static', 
       keyboard: false 
      }); 
      $('.modal-logout').modal('show'); 
     } 

     if (rejection.status === 403) { 
      console.error("Response 403 in interceptor"); 
      $rootscope.$broadcast("errorEvnt",{message:"Response 403 in interceptor"}); 
     } 

     return $q.reject(rejection); 
    }, 

Поскольку его не рекомендуется использовать rootscope в качестве службы события, которое может быть сделано через завернув в службе событий и инъекционного его там, где мы хотим слушать широковещательные события. , как указано ниже

check it here

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