所以,我有一个我用Angular编写的应用程序。它本质上是一个SPA,除了我的登录是通过传统的非Ajax请求完成的。我想要的只是在服务器返回401时将页面重定向(完全绕过路由)到/ logout。我可以设置一个基于ajax的登录,但坦率地说,我没有看到好处。考虑到这一点,如果它更容易这样做 - 我会做任何让我超越这个疯狂的烦恼的障碍,这是一个令人难以置信的简单jQuery。当我删除授权cookie时,这就是我所拥有的无限循环:
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 :(得分:0)
可能与此issue有关。
我以前在我的控制器中使用过这个,当时我根本不想使用Angular的路由:
// Abort Angular JS default location change handling.
$scope.$on('$locationChangeStart', function(event, newUrl, oldUrl) {
if (newUrl == $location.absUrl()) {
event.preventDefault();
}
});
对于您的情况,看起来您只想对某些网址进行纾困,因此您可能需要/需要进行一些模式匹配来代替newUrl == $location.absUrl()
。
这可能不适合你,因为我想避免所有Angular的路由机制,我不确定它与新版本的兼容性如何。我已将它与Angular 1.0.x版本一起使用。