2017-03-23 64 views
0

我有一個很奇怪的問題。我有一個if語句像下面這樣:Javascript布爾操作不起作用

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

凡LoginServer.getUserLoggedIn和setUserLoggedIn此:

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

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

問題很簡單。即使在next.requireLogin爲true並且LoginService.getUserLoggedIn()爲false時也不會調用If語句。在控制檯輸出如下:

true false 
false 

因此很明顯!「next.requireLogin & & LoginService.getUserLoggedIn()」的計算結果爲假,但都是正確的價值觀?如果有幫助,在Chrome控制檯中,帶「false」的最後一行將突出顯示紫色。

有誰知道錯在哪裏?

回答

5

sessionStorage存儲字符串,而不是布爾值。所以getUserLoggedIn返回字符串"true""false",並且所有非空字符串都是真的。

更改getUserLoggedIn返回一個布爾值。

​​

如果你使用console.log(next.requireLogin, LoginService.getUserLoggedIn())你會看到周圍的第二個值的報價,也許你已經意識到這個問題。當你連接時,你會丟失類型信息。

1

因爲從會話存儲返回的值是一個字符串,而不是一個布爾

console.log(!"false"); 

要麼你需要比較字符串,或將字符串轉換爲布爾。

1

這是因爲您的LoginService.getUserLoggedIn()返回「false」,而不是布爾值false。請參閱以下片段。

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

所以更換

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

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