AngularJS,$ digest尝试在需要登录的页面上重定向应用程序时出错

时间:2014-07-12 03:39:23

标签: angularjs angular-ui-router

我尝试在请求的状态需要登录的情况下重定向AngularJS应用程序。这是我在' run'中设置的方法。我的角度应用上的方法:

$rootScope.$on('$stateChangeStart', function(event, toState, toParams, fromState, fromParams) {

  if(toState.data.requiresLogin && !User.isLoggedIn)
  {
    event.preventDefault();
    $state.go('login');
  }
});

似乎很简单,但我得到了这个摘要错误。它似乎是由event.preventDefault()语句触发的。我当然不能删除它......

Error: [$rootScope:infdig] 10 $digest() iterations reached. Aborting!
Watchers fired in the last 5 iterations: [["fn: $locationWatch; newVal: 7; oldVal: 6"],["fn:     $locationWatch; newVal: 8; oldVal: 7"],["fn: $locationWatch; newVal: 9; oldVal: 8"],["fn: $locationWatch; newVal: 10; oldVal: 9"],["fn: $locationWatch; newVal: 11; oldVal: 10"]]
...

有关如何重构此内容以清除此错误的任何建议,或错误甚至意味着什么?

1 个答案:

答案 0 :(得分:1)

有一个working example,如何重定向到登录。首先定义了4个状态 - 其中2个需要 身份验证,第三个是 public (对于任何人)并且也是登录状态:

$stateProvider
    // available for anybody
    .state('public',{
        url : '/public',
        template : '<div>public</div>',
    })
    // just for authenticated
    .state('some',{
        url : '/some',
        template : '<div>some</div>',
        data : {requiresLogin : true },
    })
    // just for authenticated
    .state('other',{
        url : '/other',
        template : '<div>other</div>',
        data : {requiresLogin : true },
    })
    // the log-on screen
    .state('login',{
        url : '/login',
        templateUrl : 'tpl.login.html',
        controller : 'UserCtrl',
    })

那将是$stateChangeStart def,其中总是重定向到login - 如果需要...只有login itslef和public总是/对任何人都可用

.run(['$rootScope', '$state', 'User', function($rootScope, $state, User)
{

  $rootScope.$on('$stateChangeStart'
    , function(event, toState, toParams, fromState, fromParams) {

    var isAuthenticationRequired =  toState.data 
          && toState.data.requiresLogin 
          && !User.isLoggedIn
      ;

    if(isAuthenticationRequired)
    {
      event.preventDefault();
      $state.go('login');
    }
  });
}])

检查所有操作here