4

我有一个应用程序可以登录,并且必须决定用户是否可以在登录或未登录的情况下访问某些页面。我遇到的问题是,在到达特定路线后,我不需要模板,但我调用服务来处理将它们发送到登录页面或让它们继续。该服务检查他们是否已登录,如果没有,是否使用 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);
    };
}]); 

注意:我将代码更改为指向带有锚标记和href 指向“登录”的html模板,它工作得很好。只有当我直接通过窗口触发位置更改时,它才会卡在循环中。

更新:我从 login.html 模板中删除了所有内容,以查看 html 中的某些内容是否导致问题,删除了所有指令以及控制器范围和 rootScope 上的任何函数/模型,但问题仍然存在。

更新 2我尝试使用 angular 强制单击锚点以尝试绕过问题,但它仍然会发生。我注意到的一件有趣的事情是,如果我在 IE 中打开控制台窗口,那么问题甚至不会首先发生。到底是怎么回事????

4

3 回答 3

1

我建议使用绝对路径来确保一些不太聪明的浏览器(IE!)理解你的代码。尝试添加原点:

 window.location.href = $window.location.origin + "#/login"; 

在旁注中,我认为您使用$window.location.href而不是$location

这是官方 AngularJS 文档所推荐的 -见这里

页面重新加载导航

$location 服务只允许您更改 URL;它不允许您重新加载页面。当您需要更改 URL 并重新加载页面或导航到不同的页面时,请使用较低级别的 API,$window.location.href。

于 2013-10-09T16:20:37.027 回答
1

事实证明,问题实际上是我在整个应用程序中的控制台日志语句。我最终将它们全部评论出来,一切都开始正常工作。我想这可以解释为什么当我打开控制台时一切正常。必须爱上 IE。

于 2013-10-16T13:49:42.303 回答
0

如果其他人像我一样遇到这个问题,要考虑的另一件事是也在服务器上建立一个基本 URL。

例如,我的服务器将根重定向到'/home'. 所以'www.mydomain.com''www.mydomain.com/home'通过我的网络服务器路由约束重定向到。这完全搞砸了 IE9(在使用 Angular 时)并导致它在之后'/home'而不是之前尝试和 hash-bang,这将导致 url 继续构建'/home#!/home#!/home#!/...'等等。

一旦我放宽了我的服务器端重定向规则以允许主页是'/''/home',IE9 再次开始工作,将 hash-bang 放在站点的根目录 ( www.mydomain.com/#!/home) 而不是之后'/home'

另外,不要忘记添加一个角度路由来处理根 URL。例如:

$routeProvider.when('/', {templateUrl: '/templates/home.html', controller: 'homeCtrl'})

希望这对其他人有帮助。

于 2014-10-20T02:27:00.077 回答