Ответ 1
Совершенно очевидно, что проблема у него сводится к тому, что routeParams.loggedIn
является строкой.
Итак, решение вполне очевидно:
// Change that:
this.loggedIn = this.routeParams.loggedIn;
// To this:
this.loggedIn = this.routeParams.loggedIn === 'true';
Но почему странное поведение?
Почему работа не показывает ничего, когда loggedIn
является "ложным"?
Ну, вот почему:
В директиве ngIf
используется следующая функция toBoolean()
для преобразования ее значения в boolean:
function toBoolean(value) {
if (typeof value === 'function') {
value = true;
} else if (value && value.length !== 0) {
var v = lowercase("" + value);
value = !(v == 'f' || v == '0' || v == 'false' || v == 'no' || v == 'n' || v == '[]');
} else {
value = false;
}
return value;
}
Если строка передается в toBoolean()
, она преобразует ее в нижний регистр и проверяет (между прочим), если она равна "false" (в этом случае она возвращает false
). Это отличается от реализации JavaScript по умолчанию, которая интерпретирует любую непустую строку как true
при литье в boolean.
Итак, рассмотрим два случая как для ngIf
s:
-
loggedIn === 'true'
ngIf1 оценивает
home.loggedIn
→ 'true' (string)
ngIf1 передает это значение черезtoBoolean()
toBoolean('true')
возвращает true (потому что он видит строку, которая не может совпадать с какой-либо строкой, считающейся ложной)
ngIf1 отображает его содержимоеngIf2 оценивает
!home.loggedIn
<= >!'true'
→ false (boolean)
(это происходит потому, что любая непустая строка имеет значение true) ngIf2 передает это значение черезtoBoolean()
toBoolean(false)
возвращает false
ngIf2 не отображает его содержимое -
loggedIn === 'false'
ngIf1 оценивает
home.loggedIn
→ 'false' (строка)
ngIf1 передает это значение черезtoBoolean()
toBoolean('false')
возвращает false (потому что он видит строку, которая считается ложной
ngIf1 не отображает его содержимоеngIf2 оценивает
!home.loggedIn
<= >!'false'
→ false (boolean)
(это происходит потому, что любая непустая строка имеет значение true) ngIf2 передает это значение черезtoBoolean()
toBoolean(false)
возвращает false
ngIf2 не отображает его содержимое
Итак, это объясняет "странное" поведение (надеюсь, понятным образом).