2013-06-11 4 views
2

Итак, у меня есть приложение, которое я написал с помощью Angular. Это, по сути, SPA, за исключением того, что мой логин выполняется с помощью традиционного запроса без аякса. Все, что я хочу, - перенаправить страницу (полностью обойти маршруты) в/logout, когда сервер вернется 401. Я могу настроить вход на основе ajax, но, откровенно говоря, я не вижу преимущества. Учитывая, что, если это проще сделать, я сделаю все, что позволит мне пройти мимо этого безумно раздражающего препятствия, которое было НЕОБХОДИМО просто с помощью jQuery. Вот что у меня есть, что ставит меня в бесконечный цикл, когда я удалить куки авторизации:AngularJS (1.1.5) бесконечный цикл при авторизованном ответе

var manageModule = angular.module('manageModule', ['ngResource']); 

manageModule.config(function($httpProvider, $routeProvider, $locationProvider) { 

     $httpProvider.defaults.headers.put['Content-Type'] = 
      'application/x-www-form-urlencoded'; 
     $httpProvider.defaults.headers.post['Content-Type'] = 
      'application/x-www-form-urlencoded'; 


     $locationProvider.html5Mode(false); 


     $httpProvider.interceptors.push(function($q, $window) { 
      return { 
       'responseError': function(rejection) { 
        var status = rejection.status; 
        if (status == 401) { 
         console.log('401 inside if'); 
         $window.location.href = contextPath + '/logout'; 
        } 
        return $q.reject(rejection); 
       } 
      } 
     }); 


     $routeProvider 
      .when('/majors', { 
       templateUrl: contextPath+'/manage/majors', 
       controller: ManageMajorsController 
      }) 
      .when('/users', { 
       templateUrl: contextPath+'/manage/users', 
       controller: ManageUsersController 
      }) 
      .when('/courses', { 
       templateUrl: contextPath+'/manage/courses', 
       controller: ManageCoursesController 
      }) 
      .when('/notes', { 
       templateUrl: contextPath+'/manage/notes', 
       controller: ManageNotesController 
      }) 
      .when('/manage', { 
       templateUrl: contextPath+'/manage/majors', 
       controller: ManageMajorsController 
      }); 

}); 

Спасибо за любую помощь вы можете предоставить!

Это, кажется, несколько новое поведение, я помню, что он находится в цикле переадресации. В любом случае, вот что выводит на консоль бесконечно.

Error: 10 $digest() iterations reached. Aborting! 
Watchers fired in the last 5 iterations: [["fn: function(){var a=d.url(),b=f.$$replace;if(!m||a!=f.absUrl())m++,\nc.$evalAsync(function(){c.$broadcast(\"$locationChangeStart\",f.absUrl(),a).defaultPrevented?f.$$parse(a):(d.url(f.absUrl(),b),i(a))});f.$$replace=!1;return m}; newVal: 15; oldVal: 14"],["fn: function(){var a=d.url(),b=f.$$replace;if(!m||a!=f.absUrl())m++,\nc.$evalAsync(function(){c.$broadcast(\"$locationChangeStart\",f.absUrl(),a).defaultPrevented?f.$$parse(a):(d.url(f.absUrl(),b),i(a))});f.$$replace=!1;return m}; newVal: 16; oldVal: 15"],["fn: function(){var a=d.url(),b=f.$$replace;if(!m||a!=f.absUrl())m++,\nc.$evalAsync(function(){c.$broadcast(\"$locationChangeStart\",f.absUrl(),a).defaultPrevented?f.$$parse(a):(d.url(f.absUrl(),b),i(a))});f.$$replace=!1;return m}; newVal: 17; oldVal: 16"],["fn: function(){var a=d.url(),b=f.$$replace;if(!m||a!=f.absUrl())m++,\nc.$evalAsync(function(){c.$broadcast(\"$locationChangeStart\",f.absUrl(),a).defaultPrevented?f.$$parse(a):(d.url(f.absUrl(),b),i(a))});f.$$replace=!1;return m}; newVal: 18; oldVal: 17"],["fn: function(){var a=d.url(),b=f.$$replace;if(!m||a!=f.absUrl())m++,\nc.$evalAsync(function(){c.$broadcast(\"$locationChangeStart\",f.absUrl(),a).defaultPrevented?f.$$parse(a):(d.url(f.absUrl(),b),i(a))});f.$$replace=!1;return m}; newVal: 19; oldVal: 18"]] 
    at Error (<anonymous>) 
    at Object.e.$digest (http://localhost:8080/MetroCredit/static/bundle-main_defer.js:91:135) 
    at Object.e.$apply (http://localhost:8080/MetroCredit/static/bundle-main_defer.js:92:431) 
    at j (http://localhost:8080/MetroCredit/static/bundle-main_defer.js:101:80) 
    at r (http://localhost:8080/MetroCredit/static/bundle-main_defer.js:104:449) 
    at XMLHttpRequest.v.onreadystatechange (http://localhost:8080/MetroCredit/static/bundle-main_defer.js:106:90) bundle-main_defer.js:63 
Uncaught Error: 10 $digest() iterations reached. 
+0

Когда вы говорите бесконечный цикл, вы имеете в виду угловое ограничение цикла дайджеста, или оно фактически зацикливается навсегда где-то. Если это цикл, вы видите что-нибудь в консоли (например: «401 внутри if»)? Что происходит, когда вы пытаетесь приостановить выполнение javascript в браузере? Где петля? Это цикл переадресации? – rtcherry

+0

Я отправлю петлю –

+0

Я прокомментировал мой код перехватчика http, и то же самое происходит на самом деле. –

ответ

0

Это может быть связано с этим issue.

Я использовал это раньше в моем контроллере, когда я не хотел использовать маршрутизацию угловой на всех:

// Abort Angular JS default location change handling. 
$scope.$on('$locationChangeStart', function(event, newUrl, oldUrl) { 
    if (newUrl == $location.absUrl()) { 
    event.preventDefault(); 
    } 
}); 

В вашем случае, это выглядит, как вы только хотите, чтобы спасти от определенной URL-адресов, так вам может понадобиться/нужно выполнить сопоставление шаблонов вместо newUrl == $location.absUrl().

Это может не сработать идеально для вас, так как я хотел избежать всех механизмов маршрутизации Angular, и я не уверен, насколько это совместимо с более новыми версиями. Я использовал его с выпуском Angular 1.0.x.

+0

Когда я включаю этот код, ни одна из моих маршрутов вообще не работает. –

+0

Я был на 1.1.5, и я переключился на 1.0.7, и я больше не получаю этот бесконечный цикл. –

+0

Что Я отправил * должен * убить всю маршрутизацию, поэтому я сказал, что вам нужно будет ее изменить, чтобы называть только события event.preventDefault() 'при определенных условиях. – rtcherry

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