2

Welchen Einfluss hat die Reihenfolge, in der boolesche Operatoren deklariert werden?AngularJs einmalige Bindung und Reihenfolge von Werten mit booleschen Operatoren

Controller:

$scope.show = false; 

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

Vorlage:

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

Ergebnisse im zweiten p Elemente mit der Reihenfolge der name && show Anzeige nach Schaltfläche klicken. Ich habe verstanden, dass weder Element angezeigt werden sollte als $scope.show ist bereits definiert und einmal Bindung wurde verwendet?

plunkr hier:

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

+0

vielleicht, weil $ scope.name noch nicht definiert wurde? Was ist, wenn Sie $ scope.name in 'name undefined' initiieren? – Walfrat

Antwort

3

In Angular, eine Zeitbindung wertet ständig den Ausdruck, bis sie einen nicht undefined Wert hat. Also in Ihrem Beispiel, weil der Name noch nicht definiert ist name && show bewertet ständig als undefined auf jeden Digest, bis Sie es schließlich einstellen. Wenn Sie !! verwenden, um den Namen in einen booleschen Namen umzuwandeln, erhalten Sie ein anderes Verhalten. Vom Angular docs on expressions:

Einmaliger Ausdrücke neu berechnet stoppt, sobald sie stabil sind, , die nach dem ersten Fall verdauen, wenn der Ausdruck Ergebnis ist ein nicht-undefinierter Wert (Wert Stabilisierung Algorithmus siehe unten).

So ist es nicht einmal auswerten per se, wertet sie aus auf einen Wert einmal.

+0

Danke für Ihre Antwort. Ich denke das ist eher eine allgemeine Javascript Frage. Warum 'name && show === undefined' und nicht' show && name' – JimmyBob

+0

Der '&&' -Operator liefert keinen Booleschen Wert, wenn die linke Seite falsch ist, dann gibt er diesen zurück, andernfalls gibt er den rechten zurück Handseite. Also ist "undefined && false" nicht definiert und "false && undefined" ist "false". Wenn 'name' in Ihrem Beispiel stattdessen' '' 'wäre, hätten sowohl': :(name && show) 'als auch':: (show && name) 'dasselbe Verhalten. – Scott

+0

Die [MDN Dokumente für logische Operatoren] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Logical_Operators) sind sehr gründlich und viel besser als meine Erklärung. – Scott