2

ブール演算子の宣言順序にどのような影響がありますか?ブール演算子を使用したAngularJs値の一度のバインドと順序

コントローラー:

$scope.show = false; 

$scope.clickMe = function() { 
    $scope.show = true; 
    $scope.name = 'Name defined' 
}; 

テンプレート:ボタンをクリックした後に表示name && showの順で二p要素で

<button ng-click="clickMe($event)">Click Me</button> 
<p ng-if="::(show && name)">show && name</p> 
<p ng-if="::(name && show)">name && show</p> 

結果。 $scope.showはすでに定義されていて、1回のバインディングが使用されているため、pの要素は表示されません。

plunkrここに:角度で

http://plnkr.co/edit/P0E1RhNK9EPh2Pi04c9T?p=preview

+0

$ scope.nameがまだ定義されていない可能性がありますか? $ scope.nameを 'name undefined'に初期化するとどうなりますか? – Walfrat

答えて

3

それは非undefined値になるまで、1時間結合は常に式を評価します。あなたの例では、名前がまだ定義されていないので、name && showは最終的にそれを設定するまで常にすべてのダイジェストでundefinedと評価されます。 !!を使用して名前をブール値に強制すると、異なる動作になります。 Angular docs on expressionsから:

後に起こる、彼らは安定しているいったん式が再計算を停止しますワンタイム、 式の結果は 非未定義値が(下の値の安定化アルゴリズムを参照)である場合には、第1のダイジェスト。

したがって、それ自体は一度も評価されないので、の値はに一度評価されます。

+0

あなたの答えをありがとう。私はこれが一般的なjavascriptの質問の多くであると思う。 – JimmyBob

+0

'&&'演算子はブール値に評価されません。左辺が偽であればそれを返し、そうでない場合は右を返します。なぜなら、 'name && show === undefined'は' show && name'手の側。したがって、 'undefined && false'は' undefined'ですが、 'false && undefined'は' false'です。あなたの例の 'name'が' '''の代わりに ':((name && show)'と ':(show && name)'の両方が同じ振る舞いをします。 – Scott

+0

[論理演算子のためのMDNドキュメント](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Logical_Operators)は、私の説明よりも非常に徹底しています。 – Scott

関連する問題