我有一个登录的应用程序,必须决定用户是否可以登录某些页面(如果他们已登录)。我遇到的问题是,在达到某个路线时,我不需要模板,但我会调用服务来处理将它们发送到登录页面或让它们继续。该服务检查他们是否已登录,如果使用window.location.href则将其发送到登录路由。
当它到达window.location.href行时,登录控制器被无限初始化(达到10 $ digest()迭代)并且在该点之后没有任何作用。我是否遗漏了重定向与哈希相关的东西?
这只发生在 IE9 中。循环问题不会发生在chrome或safari中。
路由代码:
angular.module('myApp', []).config(['$routeProvider', function($routeProvider) {
$routeProvider
.when('/login', {templateUrl: 'partials/login.html', controller: 'LoginCtrl', title:'Login'})
.when('/register', {template : " ", controller: 'RegisterCtrl', title:'Register'})
.when('/eBooks', {resolve: {redirect: 'LoginRouter'}});
}]);
处理登录路由的服务:
.service('LoginRouter', ['RouteService', '$rootScope', '$window', function(RouteService, $rootScope, $window) {
if (!$rootScope.isLoggedIn) {
RouteService.setModule("eBooks");
$window.location.href = "#/login"; // Causing infinite loop
}
else {
var config = $rootScope.config;
$rootScope.startLoading();
$window.location.href = config.EBOOK_URL+ "&bookId=" + config.bookId.replace("-","");
}
}]);
登录控制器:
.controller('LoginCtrl',['$scope' ,'LoginService', function ($scope, LoginService) {
$scope.user = {mtn: ""};
$scope.checkUser = function() {
LoginService.validateUser($scope);
};
}]);
注意:我更改了代码只是为了指向一个带有锚标记的html模板,并且href指向“login”,它运行得很好。只有当我通过窗口直接触发位置更改时才会卡在循环中。
更新:我从login.html模板中删除了所有内容,以查看html中的某些内容是否导致了问题,删除了所有指令以及控制器作用域和rootScope上的所有函数/模型问题发生了。
更新2 我尝试使用角度来强制点击锚点试图绕过问题,但它仍然会发生。我注意到一个有趣的事情是,如果我在IE中打开控制台窗口,那么问题首先就不会发生。发生了什么????
答案 0 :(得分:1)
我建议使用绝对路径只是为了确保一些不那么聪明的浏览器(IE!)能够理解你的代码。尝试添加原点:
window.location.href = $window.location.origin + "#/login";
另一方面,我认为您使用$window.location.href
代替$location
正确行事
这是官方AngularJS文档推荐的内容 - see here:
网页重新加载导航
$ location服务允许您仅更改URL;它不允许您重新加载页面。当您需要更改URL并重新加载页面或导航到其他页面时,请使用较低级别的API,$ window.location.href。
答案 1 :(得分:1)
事实证明,问题实际上是我在整个应用程序中使用的控制台日志语句。我最终评论了他们所有的一切,一切都开始工作得很好。我想这可以解释为什么当我打开控制台时一切正常。喜欢IE。
答案 2 :(得分:0)
如果其他人遇到这种情况,就像我一样,另外要考虑的是在服务器上建立一个基本URL。
例如,我的服务器将根重定向到'/home'
。因此'www.mydomain.com'
会通过我的网络服务器路由限制重定向到'www.mydomain.com/home'
。这完全搞砸了IE9(虽然使用了角度)并导致它在'/home'
之后尝试哈希爆炸,而不是之前,这将导致网址继续构建'/home#!/home#!/home#!/...'
等等。
一旦我放宽了我的服务器端重定向规则以允许主页为'/'
或'/home'
,IE9再次开始工作,将hash-bang放在网站的根目录下( www.mydomain.com/#!/home
)而不是'/home'
之后。
此外,不要忘记添加角度路由来处理根URL。例如:
$routeProvider.when('/', {templateUrl: '/templates/home.html', controller: 'homeCtrl'})
希望这有助于其他人。