Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/411.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Angular-ui路由器在路由前等待承诺_Javascript_Angularjs_Routes_Angular Ui Router - Fatal编程技术网

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();
        }
    }
});
`

它通常工作得很好,但我注意到很多时候应用程序在promise
permissionAPI.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',…)
,您可以在不同的路由中对其进行不同的处理(或者只需在基本控制器中对其进行处理)。