3

我开发了一个应用程序,并且我有一个 REST API 用于从我的 AngularJS 应用程序中获取应用程序资源。当用户自己登录时,我将他的访问令牌保存在 cookie 中。如果他刷新页面,我想从令牌中获取用户信息,例如:

mymodule.run(function ($rootScope, $cookies, AuthService, Restangular) {
    if ($cookies.usertoken) {
        // call GET api/account/
        Restangular.one('account', '').get().then( function(user) {
            AuthService.setCurrentUser(user);
        });
    }
});

认证服务:

mymodule.factory('AuthService', function($http, $rootScope) {
    var currentUser = null;

    return {
        setCurrentUser: function(user) {
            currentUser = user;
        },
        getCurrentUser: function() {
            return currentUser;
        }
    };
});

但是如果用户访问需要用户变量的控制器:

mymodule.controller('DashboardCtrl', function (AuthService) {
     var user = AuthService.getCurrentUser();
});

控制器代码是在 API 调用结束之前执行的,所以我有一个空变量。在启动控制器之前等待用户数据加载是否有一个好的解决方案?

我找到了这个链接,但我正在寻找一种更全局的方法来初始化应用程序上下文。

4

2 回答 2

5

这是我喜欢处理的一种方法,假设 Restangular 从then(我没有使用过 Restangular)返回新的承诺。Promise 可以存储在类似 on 的某个地方AuthService,然后在控制器中使用。首先,添加一个属性来AuthService保存新的承诺:

return {
    authPromise: {},  // this will hold the promise from Restangular
    // setCurrentUser, getCurrentUser
    // ...

调用 Restangular 时,保存 promise 并确保返回用户数据,以便控制器稍后可以访问它,如下所示:

AuthService.authPromise = Restangular.one('account', '').get()
                          .then( function(user) {
                              AuthService.setCurrentUser(user);
                              return user; // <--important
                           });

最后,在控制器中创建一个新的 Promise 来设置user变量:

mymodule.controller('DashboardCtrl', function (AuthService) {
    var user;
    AuthService.authPromise.then(function(resultUser){
        user = resultUser;
        alert(user);
        // do something with user
    });
});

演示这是一个小提琴,我在其中模拟了一个 AJAX 调用$timeout。当超时结束时,承诺解决。

于 2013-05-31T15:26:47.020 回答
1

您可以尝试在父控制器上使用身份验证方法。然后在路由中的 resolve 方法中你可以去resolve:DashboardCtrl.$parent.Authenticate()

于 2013-05-31T14:35:02.950 回答