Kątowe, leniwe, jednorazowe wiązanie dla wyrażeń

93

AngularJS ma nową funkcję od wersji 1.3.0-beta.10: „leniwe jednorazowe wiązanie” .

Proste wyrażenia mogą być poprzedzone prefiksem ::, informując Angulara, aby przestał obserwować po pierwszym oszacowaniu wyrażenia. Typowy podany przykład to:

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

Czy istnieje podobna składnia dla wyrażeń, takich jak poniższe?

<div ng-if="user.isSomething && user.isSomethingElse"></div>
<div ng-class="{classNameFoo: user.isSomething}"></div>
seldary
źródło
Szczegółowe wyjaśnienie można znaleźć w dokumentacji kątowej: docs.angularjs.org/guide/expression#one-time-binding
Akshay Gundewar,

Odpowiedzi:

160

Tak. Możesz poprzedzić wszystkie wyrażenia ::, nawet te z ngIflub ngClass:

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

W rzeczywistości kod po prostu sprawdza, czy dwa pierwsze znaki w wyrażeniu służą :do aktywacji jednorazowego powiązania (a następnie je usuwa, dzięki czemu nawiasy nie są nawet potrzebne). Cała reszta pozostaje taka sama.

Czarna dziura
źródło
3
Odpowiada na moje pytanie, chociaż niektóre nowe funkcje nie działają dobrze: <div ng-if="::user.isSomething"></div>i <div ng-if="::(!user.isSomething)"></div>obie renderują. Działa bez „::”.
seldary
@seldary Nie mogę odtworzyć problemu. Wszystkie wyrażenia z prefiksem ::działają dobrze, jak wyjaśniono w mojej edycji. Czy potrafisz zagrać na skrzypcach, jeśli masz wątpliwości?
Blackhole
7
Na początku wydawało się, że nie działa również dla mnie, z ngClass, który miał wiele zdefiniowanych klas. Szybko dowiedziałem się, że powiązanie było nadal powiązane, ponieważ niektóre z obserwowanych zmiennych używanych w ngClass nie zostały jeszcze zdefiniowane (i wiemy, że angular będzie czekał na zdefiniowanie wartości najpierw przed zwolnieniem obserwatora). Oto małe skrzypce pokazujące to zachowanie jsfiddle.net/2LkyLoop .
Denis Pshenov
1
Składnia @MaxRocket bindonce została dodana w kątowej 1.3. Więc nie zadziała w wersji 1.2 lub niższej
Berty
2
Wydaje się, że jednorazowe wiązanie ng-if nie działa. Liczba obserwatorów jest bardzo wysoka z lub bez ::. Działa dobrze w przypadku klasy ng, ale wydaje się, że ng-if nie jest dla mnie jednorazowym obowiązkiem (1.5.6). Zwróć uwagę, że próbuję jednokierunkowo powiązać właściwość obiektu pochodzącą z powtórzenia ng. Nie jestem pewien, czy to robi różnicę.
AgmLauncher,