AngularJS: Por que ng-bind é melhor que {{}} em angular?

401

Eu participei de uma das apresentações angulares e uma das pessoas da reunião mencionada ng-bindé melhor do que {{}}obrigatória.

Um dos motivos, ng-bindcoloque a variável na lista de observação e somente quando houver uma alteração de modelo, os dados serão pressionados para visualizar, por outro lado, {{}}interpolará a expressão toda vez (acho que é o ciclo angular) e pressione a tecla valor, mesmo que o valor tenha sido alterado ou não.

Também é dito que, se você não tiver muitos dados na tela, poderá usá-lo {{}}e o problema de desempenho não será visível. Alguém pode lançar alguma luz sobre esse assunto para mim?

Nair
fonte
3
Você poderia por favor verificar, se a minha resposta é a melhor
Konstantin Krass
{{}} na minha opinião não é prático, o espectador verá sua tag antes que os dados sejam carregados completamente. Gostaria de saber se a equipe Angular vai resolver esse problema.
Jerry Liang
2
@ Blazemonger: Você não pode incluir apenas o atributo ng-cloak para impedir que os modelos sejam exibidos momentaneamente?
precisa

Respostas:

322

Se você não estiver usando ng-bind, algo como isto:

<div>
  Hello, {{user.name}}
</div>

você pode ver o real Hello, {{user.name}}por um segundo antes de user.nameser resolvido (antes dos dados serem carregados)

Você poderia fazer algo assim

<div>
  Hello, <span ng-bind="user.name"></span>
</div>

se isso é um problema para você.

Outra solução é usar ng-cloak.

princípio holográfico
fonte
3
Com base no que você está dizendo, não há desempenho atingido se usarmos {{}}? Foi-me dito que, se você usar {{}}, toda vez, isso será inerpolado e gerará o resultado, mesmo que o modelo não seja alterado.
Nair
4
E como usar o ng-bind se não quiser envolver o user.name na tag span? Se eu usar colchetes, vou obter um nome limpo, sem tags html #
Victor Victor
5
@KevinMeredith, parece que quando o HTML foi carregado, mas o angular ainda não. Lembre-se de que estamos falando de modelos do lado do cliente. Toda a interpolação deve ser feita no navegador que carrega o aplicativo. Geralmente, as cargas angulares são rápidas o suficiente para não serem perceptíveis, mas em alguns casos isso se torna um problema. Então, ng-cloakfoi inventado para consertar esse problema.
princípio holográfico
17
para mim, essa não é a resposta para a pergunta, por que o ngBind é melhor. É exatamente como usar o ngBind em vez da anotação {{}} e uma referência ao ngCloak.
Konstantin Krass
4
@Victor há também ng-bind-templateonde você pode combinar as duas abordagens: ng-bind-template="Hello, {{user.name}}"Aqui o ainda ligação oferece o aumento de desempenho e não introduz qualquer outra assentamento
loother
543

Visibilidade:

Enquanto o angularjs estiver inicializando, o usuário poderá ver os colchetes no html. Isso pode ser tratado com ng-cloak. Mas, para mim, esta é uma solução alternativa, que não preciso usar, se usar ng-bind.


Atuação:

O {{}}é muito mais lento .

Esta ng-bindé uma diretiva e colocará um observador na variável passada. Portanto, ng-bindisso só será aplicado quando o valor transmitido realmente mudar .

Os suportes, por outro lado, serão sujos verificados e atualizados em todos $digest , mesmo que não seja necessário .


No momento, estou criando um grande aplicativo de página única (~ 500 ligações por visualização). Mudar de {{}} para estrito ng-bindeconomizou cerca de 20% em todos scope.$digest.


Sugestão :

Se você usar um módulo de conversão como angular-translate , sempre prefira diretivas antes da anotação entre colchetes.

{{'WELCOME'|translate}} => <span ng-translate="WELCOME"></span>

Se você precisar de uma função de filtro, é melhor optar por uma diretiva, que na verdade apenas usa seu filtro personalizado. Documentação para o serviço $ filter


ATUALIZAÇÃO 28.11.2014 (mas talvez fora do tópico):

No Angular 1.3x, a bindoncefuncionalidade foi introduzida. Portanto, você pode vincular o valor de uma expressão / atributo uma vez (será vinculado quando! = 'Indefinido').

Isso é útil quando você não espera que sua ligação seja alterada.

Uso: Coloque ::antes da ligação:

<ul>  
  <li ng-repeat="item in ::items">{{item}}</li>
</ul>  
<a-directive name="::item">
<span data-ng-bind="::value"></span>

Exemplo:

ng-repeatpara gerar alguns dados na tabela, com várias ligações por linha. Ligações de tradução, saídas de filtro, que são executadas em todos os resumos de escopo.

Konstantin Krass
fonte
32
esta é uma resposta melhor
Nim Chimpsky
13
Pelo que sei da fonte (em 24/11/2014), a interpolação encaracolada é tratada como uma diretiva (consulte addTextInterpolateDirective () em ng / compile.js). Ele também usa $ watch para que o DOM não seja tocado se o texto não for alterado, não o "verificará e atualizará" com toda digitação $, como você afirma. O que é feito em cada $ digest, porém, é que a sequência de resultados interpolada é calculada. Apenas não é atribuído ao nó de texto, a menos que seja alterado.
Matti Virkkunen
6
Eu escrevi um teste de desempenho para avaliação interna. Ele tinha 2000 entradas em uma repetição ng e exibiu 2 atributos no objeto, portanto, ligações de 2000x2. As ligações diferem em: A primeira ligação foi apenas a ligação em um intervalo. Os segundos tinham uma ligação e algum html simples. O resultado: o ng-bind foi mais rápido em cerca de 20% por escopo. Sem verificar o código, parece que o html simples adicional com uma expressão encaracolada em um elemento html leva ainda mais tempo.
precisa
2
Só quero salientar que, de acordo com os testes aqui: jsperf.com/angular-bind-vs-brackets parecem mostrar que os colchetes são mais RÁPIDOS do que os bind. (Nota: as barras são ops por segundo, portanto, quanto mais tempo for melhor). E, como os comentários anteriores apontam, seus mecanismos de observação são basicamente idênticos.
Warren
11
Como você não está fornecendo nenhuma fonte, eu dou a você uma: ng-perf.com/2014/10/30/… "ng-bind é mais rápido porque é mais simples. A interpolação precisa passar por etapas extras de verificação de contexto, jsonification de valores e muito mais. isso o torna um pouco mais lento ".
Konstantin Krass
29

ng-bind é melhor que {{...}}

Por exemplo, você poderia fazer:

<div>
  Hello, {{variable}}
</div>

Isso significa que o texto inteiro Hello, {{variable}}incluído por <div>será copiado e armazenado na memória.

Se você fizer algo assim:

<div>
  Hello, <span ng-bind="variable"></span>
</div>

Somente o valor do valor será armazenado na memória e angular registrará um observador (expressão de observação) que consiste apenas na variável.

J brian
fonte
7
Por outro lado, seu DOM é mais profundo. Dependendo do que você está fazendo, em grandes documentos isso pode afetar o desempenho da renderização.
stephband
2
Sim, acho que da mesma forma que @stephband. Se você deseja apenas exibir o nome e o sobrenome, por exemplo. Por que não apenas interpolação? Ele terá o mesmo desempenho, porque executará os mesmos relógios em 1 resumo. Como: <div> {{firstName}} {{lastName}} </div> == <div> <span ng-bind = "firstName"> </span> <span ng-bind = "lastName"> </ span> </div> .. E o primeiro parece melhor. Eu acho que depende muito do que você quer, mas no final ambos têm vantagens e desvantagens.
Pgarciacamou
3
<div ng-bind-template="{{ var1 }}, {{ var2}}"></div>é uma alternativa ao {{}} e funções como a NG-se ligam
NorthAmerican
11
Isso não é maçãs para maçãs - você está introduzindo um elemento de amplitude em uma, e não na outra. O exemplo com ng-bindseria mais comparável a <div>Hello, <span>{{variable}}</span></div>.
Iconoclasta
15

Basicamente, a sintaxe com duas curvas é mais legível naturalmente e requer menos digitação.

Ambos os casos produzem a mesma saída, mas .. se você optar por continuar, {{}}há uma chance de que o usuário veja por alguns milissegundos {{}}antes que seu modelo seja renderizado em angular. Então, se você notar algum {{}}, é melhor usar ng-bind.

Também muito importante é que somente no index.html do seu aplicativo angular você pode não renderizar {{}}. Se você estiver usando diretivas, então modelos, não há chance de ver isso, porque angular primeiro processa o modelo e depois anexa-o ao DOM.

hellopath
fonte
5
Curiosamente, não é o mesmo. Não recebo saída em ng-bind = "anArrayViaFactory" vs {{anArrayViaFactory}}. Me deparei com esse problema ao tentar gerar uma resposta json em um protótipo de jekyll, mas devido a um conflito com um modelo semelhante {{}}, fui forçado a usar o ng-bind. Um ng-bind dentro de um bloco ng-repeat (item em anArrayViaFactory) produzirá valores.
precisa saber é o seguinte
5

{{...}}significa ligação de dados bidirecional. Mas, ng-bind é realmente destinado à ligação de dados unidirecional.

O uso do ng-bind reduzirá o número de observadores em sua página. Portanto, o ng-bind será mais rápido que {{...}}. Portanto, se você deseja exibir apenas um valor e suas atualizações e não deseja refletir sua alteração da interface do usuário de volta para o controlador, vá para ng-bind . Isso aumentará o desempenho da página e reduzirá o tempo de carregamento da página.

<div>
  Hello, <span ng-bind="variable"></span>
</div>
Tessy Thomas
fonte
4

Isso ocorre porque {{}}o compilador angular considera o nó de texto e seu pai, pois existe a possibilidade de mesclar 2 {{}}nós. Portanto, há vinculadores adicionais que aumentam o tempo de carregamento. É claro que, para algumas dessas ocorrências, a diferença é imaterial; no entanto, quando você a usa em um repetidor de grande número de itens, isso causa um impacto no ambiente de tempo de execução mais lento.

Ambika Sukla
fonte
2

insira a descrição da imagem aqui

A razão pela qual o Ng-Bind é melhor porque,

Quando a sua página não está carregada, a internet está lenta ou o site carregado pela metade, você pode ver esses tipos de problemas (verifique a captura de tela com a marca de leitura) serão acionados na tela, o que é completamente estranho. Para evitar isso, devemos usar o Ng-bind

Vikas Kalapur
fonte
1

O ng-bind também tem seus problemas. Quando você tenta usar filtros angulares , limites ou qualquer outra coisa, talvez tenha problemas se usar o ng-bind . Mas, em outro caso, o ng-bind é melhor no lado do UX. Quando o usuário abre uma página, ele (10ms-100ms) exibe os símbolos ( {{...}} ), é por isso que o ng-bind é melhor .

Hazarapet Tunanyan
fonte
1

Há algum problema de cintilação em {{}}, como quando você atualiza a página e, por um breve período de spam, é vista uma expressão. Portanto, devemos usar ng-bind em vez de expressão para representação de dados.

GAURAV ROY
fonte
0

ng-bindtambém é mais seguro porque representa htmlcomo uma sequência.

Por exemplo, '<script on*=maliciousCode()></script>'será exibido como uma sequência e não será executado.

raneshu
fonte
0

De acordo com o Angular Doc:
como o ngBind é um atributo do elemento, torna as ligações invisíveis para o usuário enquanto a página está carregando ... é a principal diferença ...

Basicamente, até que todos os elementos dom não sejam carregados, não podemos vê-los e, como ngBind é um atributo do elemento, ele espera até que os doms entrem em jogo ... mais informações abaixo

ngBind
- diretiva no módulo ng

O atributo ngBind diz ao AngularJS para substituir o conteúdo de texto do elemento HTML especificado pelo valor de uma determinada expressão e atualizar o conteúdo de texto quando o valor dessa expressão for alterado.

Normalmente, você não usa o ngBind diretamente , mas usa a marcação dupla como {{expression}}, que é semelhante, mas menos detalhada.

É preferível usar ngBind em vez de {{expression}} se um modelo for exibido momentaneamente pelo navegador em seu estado bruto antes que o AngularJS o compile. Como ngBind é um atributo do elemento, torna as ligações invisíveis para o usuário enquanto a página está carregando.

Uma solução alternativa para esse problema seria usar a diretiva ngCloak . visite aqui

para obter mais informações sobre o ngbind, visite esta página: https://docs.angularjs.org/api/ng/directive/ngBind

Você pode fazer algo assim como atributo, ng-bind :

<div ng-bind="my.name"></div>

ou faça a interpolação como abaixo:

<div>{{my.name}}</div>

ou dessa maneira com os atributos ng-cloak nos AngularJs:

<div id="my-name" ng-cloak>{{my.name}}</div>

ng-manto evite piscar no dom e aguarde até que tudo esteja pronto! isso é igual ao atributo ng-bind ...

Alireza
fonte
0

Você pode consultar este site, ele fornecerá uma explicação sobre qual é o melhor, pois eu sei que {{}} isso é mais lento que o ng-bind.

http://corpus.hubwiz.com/2/angularjs/16125872.html consulte este site.

Sneha
fonte