AngularJS : Why ng-bind is better than {{}} in angular?
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
.
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.