Rilegatura una tantum pigra angolare per espressioni


93

AngularJS ha una nuova funzionalità dalla versione 1.3.0-beta.10: il "lazy one-time binding" .

Le espressioni semplici possono essere precedute da ::, dicendo ad angular di smettere di guardare dopo che l'espressione è stata valutata per la prima volta. L'esempio comune fornito è qualcosa del tipo:

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

Esiste una sintassi simile per espressioni come le seguenti?

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

Fare riferimento ai documenti angolari per una spiegazione dettagliata: docs.angularjs.org/guide/expression#one-time-binding
Akshay Gundewar

Risposte:


160

Sì. Puoi anteporre a ogni espressione ::, anche a quelle in ngIfo ngClass:

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

In realtà, il codice controlla semplicemente che i primi due caratteri nell'espressione siano :per attivare l'associazione una tantum (e poi li rimuove, quindi le parentesi non sono nemmeno necessarie). Tutto il resto rimane lo stesso.


3
Risponde alla mia domanda, anche se alcune delle nuove funzionalità non funzionano bene: <div ng-if="::user.isSomething"></div>ed <div ng-if="::(!user.isSomething)"></div>entrambe rendono. Funziona senza "::".
seldary

@seldary Non riesco a riprodurre il problema. Tutte le espressioni con prefisso ::funzionano bene per me, come spiegato nella mia modifica. Sai fare un violino, in caso di dubbio?
Blackhole

7
All'inizio sembrava non funzionare anche per me, con ngClass che aveva più classi definite. Ho scoperto rapidamente che l'associazione era ancora vincolata perché alcune delle variabili osservate utilizzate in ngClass non erano ancora definite (e sappiamo che angular aspetterà prima che il valore venga definito prima di rilasciare il watcher). Ecco un piccolo violino per dimostrare questo comportamento jsfiddle.net/2LkyLoop .
Denis Pshenov

1
La sintassi di bindonce @MaxRocket è stata aggiunta in angular 1.3. Quindi non funzionerà con 1.2 o inferiore
Berty,

2
L'associazione una tantum di ng-if non sembra funzionare. Il conteggio degli osservatori è molto alto con o senza ::. Funziona bene per ng-class, ma ng-if non sembra obbedire al binding una tantum per me (1.5.6). Nota che sto cercando di associare unidirezionale una proprietà oggetto che proviene da una ripetizione ng. Non sono sicuro che questo faccia la differenza.
AgmLauncher
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.