Angular ленивая одноразовая привязка для выражений

93

Начиная с версии 1.3.0-beta.10, в AngularJS появилась новая функция: «ленивая одноразовая привязка» .

Простые выражения могут иметь префикс ::, указывающий angular прекратить наблюдение после того, как выражение было впервые вычислено. Приведенный общий пример выглядит примерно так:

<div>{{::user.name}}</div>

Есть ли аналогичный синтаксис для выражений, подобных следующим?

<div ng-if="user.isSomething && user.isSomethingElse"></div>
<div ng-class="{classNameFoo: user.isSomething}"></div>
сельдарный
источник
Обратитесь к документации по angular за подробным объяснением: docs.angularjs.org/guide/expression#one-time-binding
Akshay Gundewar

Ответы:

160

Да. Вы можете добавлять к каждому выражению префикс ::, даже если он находится в ngIfили ngClass:

<div ng-if="::(user.isSomething && user.isSomethingElse)"></div>
<div ng-class="::{classNameFoo: user.isSomething}"></div>

Фактически, код просто проверяет, нужны ли два первых символа в выражении, :чтобы активировать одноразовую привязку (а затем удаляет их, поэтому скобки даже не нужны). Все остальное остается прежним.

Черная дыра
источник
3
Он отвечает на мой вопрос, хотя некоторые из новых функций работают некорректно: <div ng-if="::user.isSomething"></div>и <div ng-if="::(!user.isSomething)"></div>обе визуализируются. Работает без "::".
seldary
@seldary Я не могу воспроизвести проблему. Все выражения с префиксом ::работают для меня, как описано в моем редактировании. Можете ли вы сделать скрипку, если сомневаетесь?
Blackhole
7
Сначала мне показалось, что это тоже не работает с ngClass, в котором было определено несколько классов. Я быстро обнаружил, что привязка все еще была привязана, потому что некоторые из наблюдаемых переменных, используемых в ngClass, еще не были определены (и мы знаем, что angular будет сначала ждать определения значения, прежде чем выпустить наблюдателя). Вот небольшая скрипка для демонстрации этого поведения jsfiddle.net/2LkyLoop .
Денис Пшенов 04
1
Синтаксис @MaxRocket bindonce был добавлен в angular 1.3. Так что он не будет работать в 1.2 или ниже
Берти
2
Одноразовая привязка ng-if не работает. Количество наблюдателей очень велико с расширением ::. Он хорошо работает для ng-class, но ng-if, похоже, не подчиняется одноразовой привязке для меня (1.5.6). Обратите внимание, что я пытаюсь односторонне привязать свойство объекта, полученное из ng-repeat. Не уверен, что это имеет значение.
AgmLauncher