Join the Stack Overflow Community
Stack Overflow is a community of 4.7 million programmers, just like you, helping each other.
Join them; it only takes a minute:
Sign up

I was in one of the angular presentation and one of the person in the meeting mentioned ng-bind is better than {{}} binding.

One of the reason, ng-bind put the variable in the watch list and only when there is a model change the data get pushed to view, on the other hand, {{}} will interpolate the expression every time (I guess it is the angular cycle) and push the value, even if the value changed or not.

Also it is said that, if you have not much data in on the screen you can use {{}} and the performance issue will not be visible. Can someone shed some light on this issue for me?

share|improve this question
9  
2  
Could you please check, if my answer is the better – Konstantin Krass Feb 26 '15 at 9:13
    
{{}} in my opinion is not practical, the viewer will see your tag before data is loaded completely. I wonder if Angular team is ever going to fix this issue. – Jerry Liang May 29 '15 at 1:21
1  
@Blazemonger: Can't you just include ng-cloak attribute to prevent templates being momentarily displayed? – supershnee Dec 17 '15 at 23:22
up vote 244 down vote accepted

If you are not using ng-bind, instead something like this:

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

you might see the actual Hello, {{user.name}} for a second before user.name is resolved (before the data is loaded)

You could do something like this

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

if that's an issue for you.

Another solution is to use ng-cloak.

share|improve this answer
2  
Based on what you are saying, there no performance hit if we use {{}}? I was told, if you use {{}}, everytime, that will get inerpolate and generate the result even if the model does not change. – Nair Apr 20 '13 at 23:53
3  
And how to use ng-bind if I don't want to wrap user.name inside span tag? If I uset curly brackets I'll get clean name, without html tags – Victor Nov 30 '13 at 12:51
5  
@KevinMeredith it appears like that when the HTML has loaded, but angular has not (yet). Remember that it's client-side templating we're talking about. All the interpolation has to be done in the browser loading the app. Usually angular loads fast enough for it not to be noticeable, but in some cases it becomes a problem. So, ng-cloak was invented to mend this problem. – finishingmove Jan 5 '14 at 10:45
11  
for me, this is not the answer to the question, why ngBind is better. It's just how to use ngBind instead of the {{}} annotation and a reference to ngCloak. – Konstantin Krass Sep 15 '14 at 6:28
3  
@Victor there is also ng-bind-template where you can combine both approaches: ng-bind-template="Hello, {{user.name}}" Here the binding still offers the performance boost and does not introduce any further nesting – loother Mar 4 '15 at 9:21

Visibility:

While your angularjs is bootstrapping, the user might see your placed brackets in the html. This can be handled with ng-cloak. But for me this is a workaround, that i don't need to use, if i use ng-bind.


Performance:

The {{}} is much slower.

This ng-bind is a directive and will place a watcher on the passed variable. So the ng-bind will only apply, when the passed value does actually change.

The brackets on the other hand will be dirty checked and refreshed in every $digest, even if it's not necessary.


I am currently building a big single page app (~500 bindings per view). Changing from {{}} to strict ng-bind did save us about 20% in every scope.$digest.


Suggestion:

If you use a translation module such as angular-translate, always prefer directives before brackets annotation.

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

If you need an filter function, better go for a directive, that actually just uses your custom filter. Documentation for $filter service


UPDATE 28.11.2014 (but maybe off the topic):

In Angular 1.3x the "bindonce" functionality got introduced. Therefore you can bind the value of an expression/attribute once (will be bound when != 'undefined').

This is useful, when you dont expect your binding to change.

Usage: Place "::" before your binding:

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

Example:

ng-repeat to output some data in the table, with multiple bindings per row. Translation-bindings, filter outputs, which get executed in every scope digest.

share|improve this answer
17  
this is a better answer – NimChimpsky May 15 '14 at 11:20
9  
From what I can tell from the source (as of 2014-11-24), curly interpolation is handled just like a directive (see addTextInterpolateDirective() in ng/compile.js). It also uses $watch so the DOM is not touched if the text doesn't change, it does not "dirty check and refresh" it on every $digest as you claim. What is done on every $digest though is that the interpolated result string is calculated. It's just not assigned to the text node unless it changes. – Matti Virkkunen Nov 24 '14 at 2:47
5  
I wrote a performance test for internal evaluation. It had 2000 entries in an ng repeat and displayed 2 attributes in the object, so 2000x2 bindings. The bindings differ in: First binding was just the binding in a span. The seconds had a binding and some plain html in it. The result: ng-bind was faster about 20% per scope apply. Without checking the code, it seems, that additional plain html with a curly expression in a html element takes even more time. – Konstantin Krass Nov 24 '14 at 10:51
2  
Just want to point out that according to the tests here: jsperf.com/angular-bind-vs-brackets seem to show that brackets are FASTER than bind. (Note: bars are ops per second, thus longer is better). And as previous comments point out, their watching mechanisms are ultimately identical. – Warren Dec 9 '14 at 12:42
1  
Because you'r not providing any source, i give you one: ng-perf.com/2014/10/30/… "ng-bind is faster because it’s simpler. interpolation has to go through extra steps of verifying context, jsonification of values and more. that makes it slightly slower." – Konstantin Krass Aug 18 '15 at 7:23

ng-bind is better than {{...}}

For example, you could do:

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

This means that the whole text Hello, {{variable}} enclosed by <div> will be copied and stored in memory.

If instead you do something like this:

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

Only the value of the value will be stored in memory, and angular will register a watcher (watch expression) which consists of the variable only.

share|improve this answer
4  
On the other hand, your DOM is deeper. Depending on what you're doing, in big documents this could impact rendering performance. – stephband Apr 29 '14 at 1:22
2  
Yeah, I think the same way @stephband does. If you just want to display name and last name, for example. Why not just interpolation? It will perform the same way because it will run the same watches in 1 digest. Like: <div>{{firstName}} {{lastName}}</div> == <div><span ng-bind="firstName"></span> <span ng-bind="lastName"></span></div> .. And the first one looks better. I think it depends a lot on what you want but in the end they both have advantages and disadvantages. – camou May 10 '14 at 0:21
3  
<div ng-bind-template="{{ var1 }}, {{ var2}}"></div> is an alternative to {{ }} and functions like ng-bind – northamerican Aug 5 '15 at 0:49
1  
This is not apples to apples—you're introducing a span element in one, and not the other. The example with ng-bind would be more comparable to <div>Hello, <span>{{variable}}</span></div>. – iconoclast Apr 13 at 18:55

Basically the double-curly syntax is more naturally readable and requires less typing.

Both cases produce the same output but.. if you choose to go with the double-curly there is a chance that the user will see for some milisecs the {{}} before your template rendered by angular. So if you notice any {{}} then is better to use ng-bind.

Also very important is that only in your index.html of your angular app you can have un-rendered {{}}. If you are using directives so then templates, there is no chance to see that because angular first render the template and after append it to the DOM.

share|improve this answer
5  
Interestingly enough, it's not the same. I get no output on ng-bind="anArrayViaFactory" vs {{anArrayViaFactory}}. I came across this issue when trying to output a json response in a jekyll protoype but because of a conflict with similar templating {{}}, I was forced to used ng-bind. An ng-bind inside an ng-repeat block (item in anArrayViaFactory) will output values. – eddywashere Jan 21 '14 at 23:16

This is because with {{}} angular compiler considers both the text node and it's parent as there is a possibility of merging of 2 {{}} nodes. Hence there are additional linkers that add to the load time. Of course for a few such occurrences the difference is immaterial, however when you are using this inside a repeater of large number of items, it will cause an impact in slower runtime environment.

share|improve this answer

ng-bind has its problems too.When you try to use angular filters, limit or something else, you maybe can have problem if you use ng-bind. But in other case, ng-bind is better in UX side.when user opens a page, he/she will see (10ms-100ms) that print symbols ( {{ ... }} ), that's why ng-bind is better.

share|improve this answer

protected by Pankaj Parkar Nov 27 '15 at 12:03

Thank you for your interest in this question. Because it has attracted low-quality or spam answers that had to be removed, posting an answer now requires 10 reputation on this site (the association bonus does not count).

Would you like to answer one of these unanswered questions instead?

Not the answer you're looking for? Browse other questions tagged or ask your own question.