Lot*_*re1 17 angularjs angular-ui-router
我正在尝试将登录引入用户在应用程序中导航的方式.
如果该页面符合特定要求,我假装将用户重定向到他导航到登录页面之前的页面
防止来自$ stateChangeStart的事件停止状态改变如预期但当我运行$ state.go('into_somewhere')时我进入一个无限循环
我的角度版本是1.3.1,ui-router是最新版本
.factory('RouteHistory', function ($rootScope,$log, $state, Auth, $urlRouter, $timeout) {
// after the user enter a page
var currentState = '';
// when the user is trying to access a page that he has not permissions
// or that requires the user to be logged in
var pendingState = '';
var isMenuTogglerVisible = false;
var skipFromStateVal = true;
$rootScope.$on('$stateChangeStart', function(event, toState, toParams, fromState, fromParams){
event.preventDefault();
if (toState.name == 'login' && fromState.name != 'login'){
$log.log('Ui-router: changing to login');
// $urlRouter.sync();
$state.go('login')
//pendingState = fromState;
//$log.log('Peding state updated to:' + pendingState.name );
//$urlRouter.sync();
}
if (fromState.name == 'login' && Auth.isLoggedIn()) {
$log.log('Ui-router: going from login');
//$state.go(fromState.name);
$timeout(function(){
// $state.go('home', null, {/*reload: true, location: 'replace'*/});
$state.go('browse-machine');
//$urlRouter.sync();
},2000)
}
$log.log({
'toState': toState,
'toParams': toParams,
'fromState': fromState,
'fromParams': fromParams
})
})
return {
};
});
Run Code Online (Sandbox Code Playgroud)
Rad*_*ler 13
一般来说,我会说,只有在需要时才重定向($state.go()) .在其他情况下,从事件监听器中退出:
if (toState.name === 'login' ){
// doe she/he try to go to login? - let him/her go
return;
}
if(Auth.isLoggedIn()){
// is logged in? - can go anyhwere
return;
}
// else
$state.go('login')
Run Code Online (Sandbox Code Playgroud)
这是简化的逻辑,但表明我们应该只在需要时改为执行.还有一些其他考试有更详细的实施和掠夺者:
...
// three new lines
if (toState.name === 'specialRoute'){
return;
}
if (fromState.name=='route1'){
event.preventDefault();
$state.go('specialRoute')
}
Run Code Online (Sandbox Code Playgroud)
而这是不循环了.请在这里查看
您应该使用notify选项:
$state.go('your.state',{ your params },{notify: false});
Run Code Online (Sandbox Code Playgroud)
这将阻止stateChangeStart再次触发.
这个答案帮助了我:
$urlRouterProvider.otherwise( function($injector, $location) {
var $state = $injector.get("$state");
$state.go("app.home");
});
Run Code Online (Sandbox Code Playgroud)
原文: 为什么带有ui-router的AngularJS会继续触发$ stateChangeStart事件?
| 归档时间: |
|
| 查看次数: |
23557 次 |
| 最近记录: |