2014-04-26 12 views
18

Wer weiß, warum meine Scope-Variablen nicht aktualisiert werden? Es ist verrückt nach mir. Die sessionStorage-Variablen sind in Ordnung, aber wenn ich sie innerhalb der Scope-Variablen definiere, bekomme ich 'undefined' Fehler. Ich habe mit $ scope. $ Apply gebastelt, aber anscheinend wird der Umfang bereits verdaut ...: S bitte helfen Sie einem Neuling heraus.Angularjs sessionSpeicher und Bereich

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; 

    } 

der vollständige Code:

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


}]); 

Zusammenfassung der Kette von Ereignissen:

1) Benutzer anmeldet

2) Nach der erfolgreichen Anmeldung des Benutzers Details (JSON-Objekt) sind in sessionStorage.user = data.user gespeichert und die Variable data.user enthält typischerweise diese Art von Informationen {id: 1, username: "user123", firstname: "", lastname: "", email: "[email protected]"} -der Gravatar Hash des Benutzers ist auch st in einer sessionStorage.user.gravatar-Variable gespeichert.

3) Wenn sich der Benutzer abmeldet, werden sessionStorage-Variablen gelöscht.

4) Wenn jedoch Benutzer noch angemeldet ist, frischt/die Seite neu geladen (von Browser), die session Variable ist immer noch aktiv, und enthält noch die Daten, ABER aus irgendeinem Grund, wenn ich Umfang Variablen z.B. $scope.user = sessionStorage.user - Die Scope-Variable bleibt undefiniert - obwohl sessionStorage.user vollkommen brauchbar ist. Das Problem scheint mit dem Umfang zu sein.

+0

Sind Sie sicher, dass der sessionStorage.user ein Objekt ist? – JimmyRare

+0

können Sie die Kette von Ereignissen angeben, die Sie aufrufen und was das erwartete Verhalten sein sollte – adrichman

+0

können Sie dies in eine jfiddle, jsbin oder Plunker bekommen? auch wichtig sein kann, welchen Browser Sie verwenden – Maslow

Antwort

35

Sie müssen Ihr Benutzerobjekt vor dem Speichern in sessionStorage in JSON serialisieren, da es als Sammlung von Zeichenfolgenwerten implementiert ist.

Versuchen so etwas wie dieses

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

und dann

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

Hinweis: Es gibt auch ['angular.fromJson (json);'] (https://docs.angularjs.org/api/ng/function/angular.fromJson). – kaiser

5

Heute AngularJS nicht die JSON.stringify haben nur die $ scope Werte in session zuweisen

$sessionStorage.user = $scope.user; 
Verwandte Themen