Angularjs sessionStorage和范围 [英] Angularjs sessionStorage and scope

查看:130
本文介绍了Angularjs sessionStorage和范围的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

Anyone know why my scope variables aren't being updated? It's mind boggling to me. The sessionStorage variables are fine but when I define them within scope variables.. I get 'undefined' errors. I've tinkered with $scope.$apply but apparently the scope is already being digested...:S please help a newbie out.

  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;

  }

完整代码:

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


}]);

事件链摘要:

1)用户登录

2)成功登录后,用户的详细信息(json对象)存储在 sessionStorage.user = data.user 和data.user变量通常包含这种信息 {id:1,用户名:user123,名字:,姓氏:,电子邮件:username @ gmail.com}
- 用户的重力哈希也存储在sessionStorage.user.gravatar变量中。

2) Upon successful login, the user's details (json object) are stored in sessionStorage.user = data.user and the data.user variable typically contains this sort of info {id: 1, username: "user123", firstname: "", lastname: "", email: "username@gmail.com"} -the user's gravatar hash is also stored in a sessionStorage.user.gravatar variable.

3)如果用户退出,会删除sessionStorage变量。

3) If user logs out, sessionStorage variables are deleted.

4)但是,如果用户仍然是登录,刷新/重新加载页面(从浏览器),sessionStorage变量仍处于活动状态,并且当我设置范围变量时,仍然包含数据 BUT $ scope.user = sessionStorage.user - 范围变量保持未定义 - 尽管sessionStorage.user完全可行。问题似乎与范围有关。

4) However, if user is still logged in, refreshes/reloads the page (from browser), the sessionStorage variable is still active, and still contains the data, BUT for some reason, when I set scope variables eg. $scope.user = sessionStorage.user--the scope variable remains undefined--despite sessionStorage.user being perfectly viable. The issue appears to be with the scope.

推荐答案

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

You need to serialize your user object to JSON before storing on sessionStorage, because it is implemented as a collection of string values.

尝试这样的事情

 sessionStorage.user = JSON.stringify($scope.user);

然后

 $scope.user = JSON.parse(sessionStorage.user);

这篇关于Angularjs sessionStorage和范围的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆