javascript - Angular ui-router,可以在其他解析之前解析身份验证检查吗?

标签 javascript angularjs authentication angular-ui-router angularjs-authentication

在 ui-router 中使用解析时,是否可以在某个状态上的其他解析启动之前先解析某些内容(例如身份验证检查)?

这是我现在如何进行身份验证检查的示例:

angular.module('Example', [
    'ui.router',
    'services.auth',
    'services.api'
])

.config(['$stateProvider', function ($stateProvider) {
    $stateProvider.state('order', {
        url: '/order',
        views: {
            'main': {
                templateUrl: 'order/order.tpl.html',
                controller: 'OrderCtrl'
            }
        },
        resolve: {
            // I want this one to resolve before any of the others even start.
            loggedIn: ['auth', function (auth) {
                return auth.loggedIn();
            }],
            cards: ['api', function (api) {
                return api.getCards();
            }],
            shippingAddresses: ['api', function (api) {
                return api.getShippingAddresses();
            }]
        }
    });
}]);

我希望在 cardsshippingAddresses 启动之前首先解析 loggedIn

我可以将其他 API 调用放入 Controller 中(这就是它们之前所在的位置),但我希望在模板开始渲染之前从它们检索到的数据可用。

这可能有效,但我无法注入(inject)每个单独 API 调用的解析值。

...
resolve: {
    // I want this one to resolve before any of the others even start.
    loggedIn: ['auth', 'api', function (auth, api) {
        return auth.loggedIn()
            .then(api.getCards())
            .then(api.getShippingAddresses())
            .then(function () {
                // whatever....
            });
    }]
}
...

编辑:

看起来像答案here解决了我的问题,也许这不是解决这个问题的最佳方法,但它有效。

只需注入(inject)身份验证检查的已解析值,它就会等到该值解析后才继续进行其他解析。

...
resolve: {
    // I want this one to resolve before any of the others even start.
    loggedIn: ['auth', function (auth) {
        return auth.loggedIn();
    }],
    cards: ['api', 'loggedIn', function (api, loggedIn) {
        return api.getCards();
    }],
    shippingAddresses: ['api', 'loggedIn', function (api, loggedIn) {
        return api.getShippingAddresses();
    }]
}
...

我会自己回答这个问题,但我会开放给其他人提供他们的解决方案。

最佳答案

我提供了一些如何将 Promise 组合在一起的概念证明:http://jsfiddle.net/pP7Uh/1/ 任何拒绝都会阻止调用下一个 then 方法

resolve: {
    data: function (api) {
        var state;
        return api.loggedIn().then(function(loggedIn) {
            state = loggedIn
            return api.getCards();
        }).then(function(getCards) {
            return {
                loggedIn: state,
                getCards: getCards
            }
        }).catch(function(error) {
            console.error('error', error)
        });
    }
}

在此之后的数据解析对象中,您将拥有:

 {
  loggedIn:"calling loggedIn",
  getCards:"calling getCards"
 }

关于javascript - Angular ui-router,可以在其他解析之前解析身份验证检查吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24213780/

相关文章:

javascript - CSS Grid 两行嵌套在一列中

javascript - Angular 等待 module.run 中的 promise

Angularjs mdDialog - 如何将数据发送回我的第一个 Controller

javascript - Node.JS 对密码进行哈希处理时出现 Binding.PBKDF2 错误

javascript - 为什么要在 javascript 中使用 0 > 0?

javascript - Ruby on Rails 中的 morris.js 错误

javascript - AngularJS - 如何对操作 HTML 的指令进行单元测试?

angularjs - 带有 ng-repeat 的 ui.bootstrap.buttons

authentication - 针对 API 服务器的 kubernetes 身份验证

javascript - 如何在第一个请求(Windows 身份验证)中触发带有授权 header 的 AJAX 帖子?