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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.