ChatGPT解决这个技术问题 Extra ChatGPT

AngularJS : Why ng-bind is better than {{}} in angular?

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?

Could you please check, if my answer is the better
{{}} 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.
@Blazemonger: Can't you just include ng-cloak attribute to prevent templates being momentarily displayed?

D
Drewness

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 a 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 was introduced. Therefore you can bind the value of an expression/attribute once (will be bound when != 'undefined').

This is useful when you don't 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.


this is a better answer
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.
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.
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.
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."
s
serv-inc

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.


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.
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
@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.
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.
@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
N
Nico

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.


On the other hand, your DOM is deeper. Depending on what you're doing, in big documents this could impact rendering performance.
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:
{{firstName}} {{lastName}}
==
.. 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.
<div ng-bind-template="{{ var1 }}, {{ var2}}"></div> is an alternative to {{ }} and functions like ng-bind
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>.
D
Drewness

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 {{}} there is a chance that the user will see for some milliseconds the {{}} before your template is 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.


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.
D
Drewness

{{...}} is meant two-way data binding. But, ng-bind is actually meant for one-way data binding.

Using ng-bind will reduce the number of watchers in your page. Hence ng-bind will be faster than {{...}}. So, if you only want to display a value and its updates, and do not want to reflect its change from UI back to the controller, then go for ng-bind. This will increase the page performance and reduce the page load time.

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

D
Drewness

This is because with {{}} the 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.


C
Community

https://i.stack.imgur.com/02neu.jpg

The reason why Ng-Bind is better because,

When Your page is not Loaded or when your internet is slow or when your website loaded half, then you can see these type of issues (Check the Screen Shot with Read mark) will be triggered on Screen which is Completly weird. To avoid such we should use Ng-bind


H
Hazarapet Tunanyan

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.


G
GAURAV ROY

There is some flickering problem in {{ }} like when you refresh the page then for a short spam of time expression is seen.So we should use ng-bind instead of expression for data depiction.


r
raneshu

ng-bind is also safer because it represents html as a string.

So for example, '<script on*=maliciousCode()></script>' will be displayed as a string and not be executed.


A
Alireza

According to Angular Doc: Since ngBind is an element attribute, it makes the bindings invisible to the user while the page is loading... it's the main difference...

Basically until every dom elements not loaded, we can not see them and because ngBind is attribute on the element, it waits until the doms come into play... more info below

ngBind - directive in module ng The ngBind attribute tells AngularJS to replace the text content of the specified HTML element with the value of a given expression, and to update the text content when the value of that expression changes.

Typically, you don't use ngBind directly, but instead you use the double curly markup like {{ expression }} which is similar but less verbose.

It is preferable to use ngBind instead of {{ expression }} if a template is momentarily displayed by the browser in its raw state before AngularJS compiles it. Since ngBind is an element attribute, it makes the bindings invisible to the user while the page is loading.

An alternative solution to this problem would be using the ngCloak directive. visit here

for more info about the ngbind visit this page: https://docs.angularjs.org/api/ng/directive/ngBind

You could do something like this as attribute, ng-bind:

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

or do interpolation as below:

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

or this way with ng-cloak attributes in AngularJs:

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

ng-cloak avoid flashing on the dom and wait until all be ready! this is equal to ng-bind attribute...


S
Sneha

You can refer to this site it will give you a explanation which one is better as i know {{}} this is slower than ng-bind.

http://corpus.hubwiz.com/2/angularjs/16125872.html refer this site.