Кутовий ледачий одноразовий зв’язок для виразів


93

AngularJS має нову функцію з версії 1.3.0-beta.10: "ледача одноразова прив'язка" .

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

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

Чи існує подібний синтаксис для виразів, як наступні?

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

Детальні пояснення див. У кутових документах: 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 Я не можу відтворити проблему. Кожен вираз з префіксом ::добре працює для мене, як пояснено в моїй редакції. Чи можете ви скласти загадку, якщо сумніваєтесь?
Blackhole

7
Спочатку, здається, він не працював і для мене, з ngClass, де було визначено кілька класів. Я швидко з'ясував, що прив'язка все ще пов'язана, оскільки деякі переглянуті змінні, що використовуються в ngClass, ще не були визначені (і ми знаємо, що кутове буде чекати, коли значення буде визначене першим, перш ніж випустити спостерігача). Ось невеличка скрипка для демонстрації такої поведінки jsfiddle.net/2LkyLoop .
Денис Пшенов

1
Синтаксис @MaxRocket bindonce додано в кутовому 1.3. Тож це не буде працювати у 1,2 чи нижчій
версії

2
Одноразове прив'язування ng-if, здається, не працює. Кількість спостерігачів дуже велика як з, так і без ::. Він добре працює для ng-класу, але ng-if, здається, не підкоряється одноразовій прив'язці для мене (1.5.6). Зауважте, що я намагаюся в одну сторону прив’язати властивість об'єкта, що виникла з ng-повтору. Не впевнений, чи це має значення.
AgmLauncher
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.