Angularjs sessionStorage和范围

Tou*_*shi 25 javascript angularjs

有人知道为什么我的范围变量没有更新?这令我难以置信.sessionStorage变量很好,但是当我在范围变量中定义它们时,我得到"未定义"错误.我已经修改了$ scope.$ apply但显然范围已经消化了......:S请帮助一个新手.

  if(sessionStorage.loggedIn){

    $scope.user = sessionStorage.user;  
    $scope.user.gravatar = sessionStorage.gravatar;
    console.log($scope.user.gravatar);
    console.log('Session variable is active');
    $scope.loggedIn = sessionStorage.loggedIn;

  }
Run Code Online (Sandbox Code Playgroud)

完整代码:

app.controller('loginCtrl', ['$scope','$route','Auth','$modal','$timeout', function($scope,$route,Auth,$modal,$timeout){

  if(sessionStorage.loggedIn){

    $scope.user = sessionStorage.user;  
    $scope.user.gravatar = sessionStorage.gravatar;
    console.log($scope.user.gravatar);
    console.log('Session variable is active');
    $scope.loggedIn = sessionStorage.loggedIn;

  }

  $scope.login = function(){
    Auth.save({
      'username': $scope.username,
      'password': $scope.password
    },function(data) {
      $scope.loggedIn = true;
      $scope.user = data.user;
      $scope.user.gravatar = data.gravatar;

      sessionStorage.loggedIn = $scope.loggedIn;
      sessionStorage.user = data.user; 
      sessionStorage.gravatar = data.gravatar;
      $route.reload();

    },function(response){
      $scope.flash = response.data.flash;   
      $scope.pop = true;    
      $timeout(function(){$scope.pop = false;}, 3000);
    })

  };

  $scope.logout = function (){
    Auth.get({},function(){  
      delete sessionStorage.user;
      delete sessionStorage.gravatar;
      delete sessionStorage.loggedIn;
      $scope.loggedIn = false;
      $timeout(function(){$route.reload();}, 1000);
    })
  };


}]);
Run Code Online (Sandbox Code Playgroud)

事件链摘要:

1)用户登录

2)成功登录后,存储用户的详细信息(json对象)sessionStorage.user = data.user,data.user变量通常包含此类信息{id: 1, username: "user123", firstname: "", lastname: "", email: "username@gmail.com"} - 用户的gravatar哈希也存储在sessionStorage.user.gravatar变量中.

3)如果用户注销,则删除sessionStorage变量.

4)但是,如果用户仍然登录,刷新/重新加载页面(从浏览器),sessionStorage变量仍然是活动的,并且仍然包含数据,由于某种原因,当我设置范围变量时,例如.$scope.user = sessionStorage.user - 尽管sessionStorage.user非常可行,但范围变量仍未定义.问题似乎与范围有关.

spa*_*gas 43

在存储在sessionStorage之前,需要将用户对象序列化为JSON,因为它是作为字符串值的集合实现的.

尝试这样的事情

 sessionStorage.user = JSON.stringify($scope.user);
Run Code Online (Sandbox Code Playgroud)

然后

 $scope.user = JSON.parse(sessionStorage.user);
Run Code Online (Sandbox Code Playgroud)

  • 旁注:还有[`angular.fromJson(json);`](https://docs.angularjs.org/api/ng/function/angular.fromJson). (14认同)

小智 6

现在angularjs没有JSON.stringify只在sessionStorage中分配$ scope值

$sessionStorage.user = $scope.user;
Run Code Online (Sandbox Code Playgroud)

有关$ sessionStorage服务的详细文档

AngularJS - Scriptwerx的$ sessionStorage是一个用于AngularJS应用程序的服务.

npm install --save-dev angular-swx-session-storage