2

Какое влияние оказывает порядок, в котором объявлены логические операторы?AngularJs однократная привязка и порядок значений с булевыми операторами

Контроллер:

$scope.show = false; 

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

Шаблон:

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

Результаты во втором p элемента с порядком name && show отображаются после нажатия кнопки. Я понял, что ни элемент p не должен отображаться, поскольку $scope.show уже определен и используется однократная привязка?

plunkr здесь:

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

+0

возможно, потому что $ scope.name еще не определен? Как насчет того, если вы запустите $ scope.name для 'name undefined'? – Walfrat

ответ

3

В Угловом, связывании один раз будет постоянно оценивать выражение, пока он не имеет не- undefined значения. Поэтому в вашем примере, поскольку имя еще не определено name && show постоянно оценивает как undefined на каждом дайджесте, пока вы его окончательно не установите. Если вы используете !!, чтобы называть имя логическим, вы получите другое поведение. Из Angular docs on expressions:

Одноразовое выражение остановится перерасчетом, как только они стабильны, , которое происходит после того, как первый дайджест, если результат выражения является не-неопределенное значения (см значения алгоритма стабилизации ниже).

Так что не оценивает один раз сам по себе, он оценивает до значения раз.

+0

Спасибо за ваш ответ. Я предполагаю, что это скорее общий вопрос по javascript. Почему 'name && show === undefined', а не' show && name' – JimmyBob

+0

Оператор '&&' не вычисляет логическое значение, если левая сторона ложна, тогда он возвращает это, в противном случае он вернет право сторона. Поэтому 'undefined && false'' undefined', а 'false && undefined' -' false'. Если 'имя' в вашем примере было' ''' вместо этого, то оба типа: :(name && show) 'и': :(show && name) 'имели бы такое же поведение. – Scott

+0

[Документы MDN для логических операторов] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Logical_Operators) являются очень тщательными и намного лучше, чем мои объяснения. – Scott

Смежные вопросы