Подтвердить что ты не робот

Одноразовая привязка с ng-if в angular?

Если у меня есть представление, которое делает:

<div ng-repeat="foo in foos">
  <p ng-if="bar">omg lol</p>
  <p ng-if="!bar">lol omg</p>
</div>

Я на самом деле создаю (2 * foos.length) + 1 $$ наблюдателей, что действительно не очень хорошо. Я нашел несколько источников в Интернете, которые говорят, что вы можете делать ng-if = ":: bar", но количество наблюдателей не меняется, когда я это делаю. Есть ли способ заставить ng-быть привязкой один раз?

На самом деле это действительно глупо:

<div ng-repeat="foo in foos" ng-if="bar">
  <p>omg lol</p>
</div>
<div ng-repeat="foo in foos" ng-if="!bar">
  <p>lol omg</p>
</div>

Что я верю, даст мне что-то вроде 4 $$ наблюдателей вместо этого... Поэтому я ищу альтернативу, чтобы не быть таким глупым.

4b9b3361

Ответ 1

Просто распространяю свои комментарии, чтобы ответить.

Angular 1.3 одноразовый синтаксис привязки (::) действительно удалит ненужные часы. Просто вам нужно измерить часы через некоторое время после того, как вы установите соответствующие данные. Вот почему. Когда вы устанавливаете одноразовое свойство привязки в представлении, angular будет устанавливать временные часы на нем, пока не получит определенное значение, то есть ничего, кроме undefined. Этот подход существует по какой-то причине - для поддержки связанных значений, которые заполняются посредством отложенной операции, такой как ajax-вызов, тайм-аут, согласование цепочки предложений и т.д. Без этого :: не будет работать успешно ни на чем, кроме предварительно заполненной границы значения.

Поэтому просто убедитесь, что вы установили некоторое значение в определенный момент времени для одноразовых значений привязки. Не позволяйте ему оставаться undefined.

Скажите, если у вас есть условие <div ng-if="::lol"></div>, повторяющееся 100 раз. Просто убедитесь, что когда вы привязываете значение к репитеру или какую-либо операцию, которая определяет статус lol, даже если эта операция завершилась неудачей (скажем, ошибка вызова ajax), все еще задано значение (даже null также является значением в javascript) к нему. Часы будут удалены после предстоящего цикла дайджеста, который отображает соответствующие привязки DOM.

В вашем конкретном плунжере вы также можете:

<ul ng-repeat="item in items"  ng-if="::lol">
  <li>{{ ::item }}</li>
</ul>

вместо

<ul ng-repeat="item in items">
  <li ng-if="::lol">{{ ::item }}</li>
</ul>