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>

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.


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.