在Angular中检查sessionStorage并将变量传递给$ scope的正确方法?

时间:2015-01-14 23:51:23

标签: javascript angularjs session

我已经创建了一个基于令牌的身份验证系统,但需要一种方法让Angular知道用户是否已登录。

已登录的用户将在会话存储中拥有身份验证令牌。如果$scope.isLoggedIn = true为真,我想设置一个变量,例如if ( $window.sessionStorage.token )

然后我会根据需要使用ng-if="isLoggedIn"在页面上显示和隐藏元素。当然,在显示任何个人信息之前,会对令牌进行身份验证。这基本上是一种显示或隐藏登录页面的方式。

我可以在控制器中执行此操作,但我必须在每个控制器中执行此操作。我可以和工厂一起做吗?

这是我尝试过的,但有更好的方法吗?感谢。

app.config

$httpProvider.interceptors.push('authCheck')

app.factory

//
// set a scope variable for whether a user is signed in or not
//
.factory('authCheck', [ '$window', '$rootScope', function ( $window, $rootScope ) {
        $rootScope.isLoggedIn = false;

        if ( $window.sessionStorage.token ) {
            $rootScope.isLoggedIn = true;
        }

        return $rootScope.isLoggedIn;
}])

1 个答案:

答案 0 :(得分:1)

我使用服务做了类似的事情。我有点复杂,因为我从indexeddb而不是localstorage获取数据(我相信这是同步而不是异步。

无论如何,我的代码最终变成了......

angular.module('App').service('DataService', ['$indexedDB', 'storeName', 'emptyCharacter', function($indexedDB, storeName, newObject){
    function function1(propertyName){
        return "something";
    };

    function function2(objects){
        return 55;
    };

    return {
        foo : function1,
        bar : function2
    };
}]);

然后我在我的控制器中访问它,如:

angular.module('App').controller('Controller', ['$scope', '$interval', 'DataService', function($scope, $interval, DataService) {

    var somevar = DataService.function1();
}]);

正如您所看到的,它与您的想法非常相似。我认为这是一条非常好的路线。