检查会话存储并将变量传递给 Angular 中的$scope的正确方法

Right way to check sessionStorage and pass variable to $scope in Angular?

本文关键字:scope 中的 方法 Angular 存储 会话 变量 检查      更新时间:2023-09-26

我已经创建了一个基于令牌的身份验证系统,但需要一种方法让 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;
}])

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

无论如何,我的代码最终是这样的...

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

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