Вопрос:

Булева операция Javascript не работает

javascript angularjs if-statement session-storage

61 просмотра

3 ответа

125 Репутация автора

На этот вопрос уже есть ответ здесь:

У меня действительно странная проблема. У меня есть утверждение if, подобное следующему:

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

Проблема проста. Инструкция If никогда не вызывается, даже когда next.requireLogin имеет значение true, а LoginService.getUserLoggedIn () - false. Вывод в консоли выглядит следующим образом:

true false
false

Таким образом, очевидно, что «next.requireLogin &&! LoginService.getUserLoggedIn ()» имеет значение false, но оба значения являются правильными? Если это помогает, в консоли Chrome последняя строка со значением «false» выделяется фиолетовым цветом.

Кто-нибудь знает в чем дело?

Автор: jython234 Источник Размещён: 23.03.2017 01:26

Ответы (3)


1 плюс

159420 Репутация автора

Поскольку значение, возвращаемое из хранилища сеансов, является строкой, а не логическим значением

console.log(!"false");

Либо вам нужно сравнить со строкой, либо преобразовать строку в логическое значение.

Автор: epascarello Размещён: 23.03.2017 01:32

5 плюса

465457 Репутация автора

Решение

sessionStorageхранит строки, а не логические значения. Так что getUserLoggedInвозвращает строку "true"или "false", и все непустые строки верны.

Изменить, getUserLoggedInчтобы вернуть логическое значение.

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

Если бы вы использовали, console.log(next.requireLogin, LoginService.getUserLoggedIn())вы бы увидели кавычки вокруг второго значения, и, возможно, вы бы поняли проблему. Когда вы объединяете, вы теряете информацию о типе.

Автор: Barmar Размещён: 23.03.2017 01:32

1 плюс

7658 Репутация автора

Это потому, что вы LoginService.getUserLoggedIn()возвращаете «ложь», а не логическое ложь. Смотрите следующий фрагмент.

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")) {

Автор: VHS Размещён: 23.03.2017 01:33
Вопросы из категории :
32x32