【问题标题】:Angular - ui-router wait for a promise before routeAngular - ui-router 在路由之前等待一个承诺
【发布时间】:2017-02-17 18:21:57
【问题描述】:

我正在使用Angular 1.5.8angular-ui-router 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 的承诺为我的所有路线创建一个主要的resolve

谢谢!

【问题讨论】:

  • 这将在 Promise 开始后总是路由,而不是在 Promise 解决时路由。处理此问题的规范方法是创建一个抽象路由,其中​​包含其下所有路由的resolve。不幸的是,尝试使用本质上是异步的 Promise 作为同步函数并不是一个好的解决方案。
  • 如何连接来自 $stateChangeStart 的承诺来解析函数?
  • 这不是我的意思,我怎样才能将承诺从$stateChangeStart 传递给ui-router

标签: javascript angularjs routes angular-ui-router


【解决方案1】:

创建应用状态!如果您需要在整个应用程序中一致地访问数据,但又不想让该数据与特定视图相关联,则抽象状态非常有用。

    $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);
                }
            }
        });

然后,只要您的控制器处于 'app' 的子状态,您就可以在后续解析块中或在您的控制器(如 app.controller('ExampleCtrl', function (ActiveUser) {});)中访问该数据。这是通过命名约定'app.'

实现的

【讨论】:

  • 是否可以通过这种方式将toState 传递给AuthService
  • 我猜你正在尝试解决用户是否可以进入状态?
  • $stateChangeStart 上我会在$rootScope 上的AppCtrl 中致电AuthService.validateRouteAccess(ActiveUser)。然后我会喜欢一个$rootScope.emit('Auth.routeUnauthorized', ...),你可以在不同的路由中以不同的方式处理它(或者只在基本控制器中处理它)。
猜你喜欢
  • 2015-05-17
  • 2017-07-31
  • 2020-11-26
  • 2018-12-14
  • 2020-04-22
  • 1970-01-01
  • 1970-01-01
  • 2016-10-30
  • 2019-03-31
相关资源
最近更新 更多