2017-03-23 3 views
0

Ich habe ein wirklich seltsames Problem. Ich habe eine if-Anweisung wie die so unter:Javascript boolesche Operation funktioniert nicht

$rootScope.changeView = function(view){ 
    $location.path(view); // path not hash 
}; 

$rootScope.$on('$routeChangeStart', function (event, next) { 
    console.log(next.requireLogin + " " + LoginService.getUserLoggedIn()); 
    console.log(next.requireLogin && !LoginService.getUserLoggedIn()); 

    if(next.requireLogin && !LoginService.getUserLoggedIn()) { 
     console.log("No access to panel: not logged in."); 

     alert("You need to be logged in as an administrator to see this page!"); 
     event.preventDefault(); 

     $timeout(function() { 
      $rootScope.changeView("/"); 
     }, 500); 
    } 
}); 

Wo LoginServer.getUserLoggedIn und setUserLoggedIn sind dies:

this.setUserLoggedIn = function(value){ 
    sessionStorage.userIsLoggedIn = value; 
}; 

this.getUserLoggedIn = function() { 
    return sessionStorage.userIsLoggedIn; 
}; 

Das Problem ist einfach. Die If-Anweisung wird nie aufgerufen, auch wenn next.requireLogin wahr ist und LoginService.getUserLoggedIn() false ist. Die Ausgabe in der Konsole ist wie folgt:

true false 
false 

So scheinbar "! Next.requireLogin & & LoginService.getUserLoggedIn()" falsch ergibt, doch beide sind die richtigen Werte? Wenn es hilft, wird in der Chrome-Konsole die letzte Zeile mit "false" violett hervorgehoben.

Weiß jemand, was los ist?

Antwort

5

sessionStorage speichert Strings, nicht booleans. So gibt getUserLoggedIn die Zeichenfolge "true" oder "false" zurück, und alle nicht leeren Zeichenfolgen sind truthy.

Ändern Sie getUserLoggedIn, um einen booleschen Wert zurückzugeben.

this.getUserLoggedIn = function() { 
    return sessionStorage.userIsLoggedIn == 'true'; 
}; 

Wenn Sie benutzt hatte console.log(next.requireLogin, LoginService.getUserLoggedIn()) Sie die Anführungszeichen hätte um den zweiten Wert zu sehen, und vielleicht würde man das Problem erkannt haben. Wenn Sie verketten, verlieren Sie die Typinformation.

1

Da der Wert von Sitzungsspeicher zurück ein String ist und kein Boolean

console.log(!"false"); 

Entweder müssen Sie die Zeichenfolge, oder konvertieren Sie die Zeichenfolge in einen Booleschen zu vergleichen.

1

Das ist, weil Ihre LoginService.getUserLoggedIn() "false", nicht boolean false zurückgibt. Siehe das folgende Snippet.

var a="false"; 
 
console.log(a);//prints false 
 
console.log(!a);//prints false as well.

So ersetzen

if(next.requireLogin && !LoginService.getUserLoggedIn()) {

mit

if(next.requireLogin && (LoginService.getUserLoggedIn() == "false")) {

Verwandte Themen