Javascript Angular-ui路由器在路由前等待承诺
我正在使用Javascript Angular-ui路由器在路由前等待承诺,javascript,angularjs,routes,angular-ui-router,Javascript,Angularjs,Routes,Angular Ui Router,我正在使用Angular 1.5.8和Angular ui路由器0.3.2。 我需要解决每个路由更改的身份验证方法 我不想为每个路由添加resolve属性,因此我在App.run //check permissions $rootScope.$on('$stateChangeStart', function (evt, toState) { if ($localStorage.token || toState.authenticated) { $http.default
Angular 1.5.8
和Angular ui路由器0.3.2
。
我需要解决每个路由更改的身份验证方法
我不想为每个路由添加resolve属性,因此我在App.run
//check permissions
$rootScope.$on('$stateChangeStart', function (evt, toState) {
if ($localStorage.token || toState.authenticated) {
$http.defaults.headers.common = {
'Authorization': 'Token ' + $localStorage.token,
'Accept': 'application/json'
};
permissionAPI.me()
.then(function(data){
$rootScope.user = data;
})
.catch(function(){
if(toState.authenticated) {
$rootScope.logout();
}
})
}
else {
if(toState.authenticated) {
$rootScope.logout();
}
}
});
`
它通常工作得很好,但我注意到很多时候应用程序在promisepermissionAPI.me()
解决之前进行路由,这会在以后导致错误
我怎样才能确保这条路线在做出承诺后立即生效
或者,通过从$stateChangeStart
传递该承诺,我如何为我的所有路由制定一个主解析
谢谢大家! 创建应用程序状态!如果您需要在整个应用程序中一致地访问数据,但又不想将数据与特定视图关联,则抽象状态非常有用
$stateProvider
.state('app', {
url: '/app/',
template: '<div ui-view></div>',
controller: 'AppCtrl',
abstract: true,
resolve: {
ActiveUser: function (AuthService) {
return AuthService.whoAmI();
}
}
})
.state('app.home', {
url: '',
templateUrl: 'app.home.html',
controller: 'HomeCtrl',
resolve: {
Categories: function (ActiveUser, MessagesService) {
return MessagesService.getAll(User);
}
}
});
$stateProvider
.state('app',{
url:“/app/”,
模板:“”,
控制器:“AppCtrl”,
摘要:没错,
决心:{
ActiveUser:函数(AuthService){
返回AuthService.whoAmI();
}
}
})
.state('app.home'{
url:“”,
templateUrl:'app.home.html',
控制器:“HomeCtrl”,
决心:{
类别:功能(ActiveUser、MessagesService){
返回消息service.getAll(用户);
}
}
});
然后,您可以在后续解析块中或在您的控制器(如
app.controller('ExampleCtrl',function(ActiveUser){})中访问该数据代码>只要控制器处于'app'
的子状态。这是通过命名约定'app'实现的。
这将始终在承诺开始后路由,而不是在承诺解决时路由。处理此问题的规范方法是创建一个抽象路由,该路由下的所有路由都具有解析
。不幸的是,尝试将本质上是异步的承诺用作同步函数并不是一个好的解决方案。我如何将该承诺从$stateChangeStart
连接到解析函数?这不是我的意思,如何将承诺从$stateChangeStart
传递到ui路由器
?是否可以通过这种方式将toState
传递到AuthService
?我猜您正在尝试解决用户是否可以进入状态?在$stateChangeStart
上,我将调用AuthService.validateRouteAccess(ActiveUser)
在$rootScope
上的AppCtrl
中。然后我想要一个$rootScope.emit('Auth.routeUnauthorized',…)
,您可以在不同的路由中对其进行不同的处理(或者只需在基本控制器中对其进行处理)。