2015-11-06 38 views
1

我是AngularJS的新手,现在我试图用身份验证构建我的第一个系统。一切正常,只是,当用户刷新页面,所有的用户信息都不见了......AngularJs在认证后将用户数据保存到会话中

我跟着这个教程:

http://www.sitepoint.com/implementing-authentication-angular-applications/

现在,这是我倾向于确保用户数据保留在它应该是的位置:

当用户登录时,我的API以JSON的形式返回他/她的详细信息,然后将其分别放入$rootScope变量以用于站点以及会话中。旁边的是,我在签署时返回true rootscope一个变量,而假的时候没有,像这样:

$rootScope.loggedin = true; 
$rootScope.user = data; 
$window.sessionStorage["info"] = data; 
// console.log($window.sessionStorage["info"]); 

这一切都发生在认证的工厂。

然后,当用户刷新,而同一工厂再次跑了,下面的函数将开始工作:

function init() { 
    if ($window.sessionStorage["info"]) { 
     $rootScope.loggedin = true; 
     $rootScope.user = $window.sessionStorage["info"]; 
     info = $window.sessionStorage["info"]; 
    } 
} 
init(); 

(我认为这会工作,因为文章和其他各种来源的网页上这么说)

然后在我的HTML,我用的loggedIn变量来确定用户是否登录:

<div ng-show="!loggedin"> 
    <a href="/login" class="btn btn-default btn-flat sidebar-toggle" style="position:relative;top:-3px; right: 5px;">Log in </a> 
    <a class="btn btn-default btn-raised" style="background: #03A9F4; color:#fff; position:relative;top:-3px; right: 5px;">Registreer</a> 
</div> 

<div ng-show="loggedin"> 
    <ul class="nav navbar-nav"> 
     <li class="drop"> 

      <a href="bootstrap-elements.html" data-target="#" class="dropdown-toggle" data-toggle="dropdown">{{user.username}} <b class="caret"></b></a> 
      <ul class="" style="z-index:99999999999;"> 
       <li><a href="javascript:void(0)">Some log-in only stuff</a></li> 

      </ul> 
     </li> 
    </ul> 
</div> 

现在,所有这一切都工作得很好,当我是劳但是当我刷新页面时,它会检测到我已登录,但我的名字只是保持空白,因为我猜未定义。

这是为什么,我该如何解决?

谢谢。

+0

网络存储只存储字符串和字符串。 'user'绝对不是一个字符串。你不应该猜测'user'的值,而是检查它。 – zeroflagL

回答

2

我建议您切换到喜欢的东西,而不是ngStorage:https://github.com/gsklee/ngStorage

$ window.sessionStorage不会跨新标签或窗口仍然存在,并根据您的浏览器,甚至可能不能跨越刷新页面。所以至少应该使用localStorage(不必像$ window/window的方法那样调用,除非你期望它在你的范围中被覆盖,顺便说一句)。

此外,通常会使用sessionStorage上的getter和setter方法(getItem和setItem):https://developer.mozilla.org/en-US/docs/Web/API/Window/sessionStorage - 虽然我相信他们可以使用该对象[“key”]语法,但您可能无法使用该对象[“key”]语法。

1

我写了一个更清洁的对象来将数据存储在本地存储中。

var LocalStorageManager = { 
    setValue: function(key, value) { 
     window.localStorage.setItem(key, JSON.stringify(value)); 
    }, 
    getValue: function(key) { 
     try { 
      return JSON.parse(window.localStorage.getItem(key)); 
     } catch (e) { 

     } 
    } 
}; 

将数据保存到本地存储:

LocalStorageManager.setValue("key",data); 

要检索的数据:

LocalStorageManager.getValue("key"); 
相关问题