routeParams.loggedIn
彼の問題が文字列であるという事実に根ざしていることは明らかです。
したがって、解決策は非常に明白です。
// Change that:
this.loggedIn = this.routeParams.loggedIn;
// To this:
this.loggedIn = this.routeParams.loggedIn === 'true';
しかし、なぜ奇妙な振る舞いなのですか?'false' の
ときに何も表示されないのはなぜですか?loggedIn
さて、ここに理由があります:
このngIf
ディレクティブは、次のtoBoolean()
関数を使用してその値をブール値に変換します。
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
)。true
これは、ブール値にキャストするときに空でない文字列を解釈するデフォルトの JavaScript 実装とは異なります。
ngIf
それでは、両方の s の2 つのケースを調べてみましょう。
loggedIn === 'true'
ngIf1 は評価しhome.loggedIn
ます --> 'true' (文字列)
ngIf1 はこの値を渡しますtruetoBoolean()
toBoolean('true')
を返します(偽と見なされる文字列と一致しない文字列が表示されるため)
ngIf1 はそのコンテンツをレンダリングします
ngIf2 は!home.loggedIn
<=>を評価し!'true'
ます --> false (ブール値)
(これは、空でない文字列がたまたま true に評価されるために発生します)
ngIf2 はこの値をfalsetoBoolean()
toBoolean(false)
を返します
ngIf2 はそのコンテンツをレンダリングしません
loggedIn === 'false'
ngIf1 は評価しhome.loggedIn
ます --> 'false' (文字列)
ngIf1 はこの値を渡しますfalsetoBoolean()
toBoolean('false')
を返します(偽と見なされる文字列を見ているため
ngIf1 はそのコンテンツをレンダリングしません
ngIf2 は!home.loggedIn
<=>を評価し!'false'
ます --> false (ブール値)
(これは、空でない文字列がたまたま true に評価されるために発生します)
ngIf2 はこの値をfalsetoBoolean()
toBoolean(false)
を返します
ngIf2 はそのコンテンツをレンダリングしません
したがって、これは「奇妙な」動作を説明しています(できれば理解できる方法で)。