Vinculação única angular lenta para expressões

93

O AngularJS tem um novo recurso desde a versão 1.3.0-beta.10: o "lazy one-time binding" .

Expressões simples podem ser prefixadas com ::, dizendo ao angular para parar de observar depois que a expressão foi avaliada pela primeira vez. O exemplo comum dado é algo como:

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

Existe uma sintaxe semelhante para expressões como as seguintes?

<div ng-if="user.isSomething && user.isSomethingElse"></div>
<div ng-class="{classNameFoo: user.isSomething}"></div>
seldary
fonte
Consulte a documentação angular para obter uma explicação detalhada: docs.angularjs.org/guide/expression#one-time-binding
Akshay Gundewar

Respostas:

160

Sim. Você pode prefixar todas as expressões com ::, mesmo aquelas em ngIfou ngClass:

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

Na verdade, o código simplesmente verifica se os dois primeiros caracteres na expressão são :para ativar a ligação única (e depois os remove, portanto, os parênteses nem são necessários). Tudo o resto permanece o mesmo.

Buraco negro
fonte
3
Ele responde à minha pergunta, embora alguns dos novos recursos não funcionem bem: <div ng-if="::user.isSomething"></div>e <div ng-if="::(!user.isSomething)"></div>ambos são renderizados. Funciona sem o "::".
Seldary
@seldary Não consigo reproduzir o problema. Todas as expressões prefixadas com ::funcionam bem para mim, conforme explicado na minha edição. Você pode fazer um violino, em caso de dúvida?
Blackhole
7
No início, parecia não funcionar para mim também, com o ngClass que tinha várias classes definidas. Eu descobri rapidamente que a vinculação ainda estava limitada porque algumas das variáveis ​​observadas usadas no ngClass ainda não foram definidas (e sabemos que o angular irá esperar que o valor seja definido antes de liberar o observador). Aqui está um pequeno violino para demonstrar esse comportamento jsfiddle.net/2LkyLoop .
Denis Pshenov
1
A sintaxe bindonce @MaxRocket foi adicionada no angular 1.3. Portanto, não funcionará em 1.2 ou inferior
Berty
2
A ligação única de ng-if não parece funcionar. A contagem de observadores é muito alta com ou sem o ::. Ele funciona bem para ng-class, mas ng-if não parece obedecer à vinculação única para mim (1.5.6). Observe que estou tentando vincular unilateralmente uma propriedade de objeto que veio de uma repetição de ng. Não tenho certeza se isso faz diferença.
AgmLauncher de