我尝试在请求的状态需要登录的情况下重定向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"]]
...
有关如何重构此内容以清除此错误的任何建议,或错误甚至意味着什么?
答案 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