2014-04-26 95 views
18

任何人都知道爲什麼我的範圍變量沒有被更新?這令人難以置信。 sessionStorage變量很好,但是當我在範圍變量中定義它們時,我得到'undefined'錯誤。我用$ scope修正了$ apply,但顯然這個範圍已經被消化了......:S請幫助一個新手出來。Angularjs sessionStorage和範圍

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


}]); 

事件鏈的總結:

2)成功登錄後

1)用戶的日誌,用戶的詳細信息(JSON對象)存儲在sessionStorage.user = data.user中,並且data.user變量通常包含這種信息{id: 1, username: "user123", firstname: "", lastname: "", email: "[email protected]"} -用戶的gravatar散列也是st在sessionStorage.user.gravatar變量中存儲。

3)如果用戶註銷,會刪除sessionStorage變量。如果用戶仍然登錄,刷新/重新加載頁面(從瀏覽器),sessionStorage變量仍然是活動的,並仍然包含數據,由於某種原因,我設置範圍變量例如。 $scope.user = sessionStorage.user - 儘管sessionStorage.user是完全可行的,範圍變量仍然未定義。這個問題似乎與範圍有關。

+0

在$範圍值是你確定sessionStorage.user是一個對象? – JimmyRare

+0

你能指定你正在調用的事件鏈和你期望的行爲應該是 – adrichman

+0

你可以把它變成一個jsfiddle,jsbin或plunker嗎?也很重要的可能是你使用什麼瀏覽器 – Maslow

回答

35

在存儲到sessionStorage之前,您需要將用戶對象序列化爲JSON,因爲它是作爲字符串值的集合實現的。

嘗試這樣的事情

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

然後

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

旁註:還有['angular.fromJson(json);'](https://docs.angularjs.org/api/ng/function/angular.fromJson)。 – kaiser

5

如今angularjs沒有JSON.stringify只是在分配sessionStorage的

$sessionStorage.user = $scope.user;