In AngularJS, how can I render a value without 2-way data binding? One may want to do this for performance reasons, or even rendering a value at a given point in time.
The following examples both use data binding:
<div>{{value}}</div>
<div data-ng-bind="value"></div>
How do I render value
without any data binding?
Data binding is the process that establishes a connection between the app UI and the data it displays. If the binding has the correct settings and the data provides the proper notifications, when the data changes its value, the elements that are bound to the data reflect changes automatically.
The Angular uses the ngModel directive to achieve the two-way binding on HTML Form elements. It binds to a form element like input , select , selectarea .
Data binding in AngularJS is the synchronization between the model and the view. When data in the model changes, the view reflects the change, and when data in the view changes, the model is updated as well.
Angular 1.3+
In 1.3, Angular has supported this using the following syntax.
<div>{{::message}}</div>
As mentioned in this answer.
Angular 1.2 and below
This is simple and doesn't need a plugin. Check this out.
This small directive will easily accomplish what you are trying to achieve
app.directive('bindOnce', function() {
return {
scope: true,
link: function( $scope ) {
setTimeout(function() {
$scope.$destroy();
}, 0);
}
}
});
You can bind once like this
<div bind-once>I bind once - {{message}}</div>
You can bind like normal
<div ng-bind="message" bind-once></div>
Demo: http://jsfiddle.net/fffnb/
Some of you may be using angular batarang, and as mentioned in the comments if you use this directive the element still shows as binding when it is not, I am pretty sure this has something to do with the classes that are attached to the element so try this, it should work (not tested). Let me know in the comments if it worked for you.
app.directive('bindOnce', function() {
return {
scope: true,
link: function( $scope, $element ) {
setTimeout(function() {
$scope.$destroy();
$element.removeClass('ng-binding ng-scope');
}, 0);
}
}
});
@x0b: If you have OCD and you want to remove the empty class
attribute do this
!$element.attr('class') && $element.removeAttr('class')
It looks like Angular 1.3 (starting with beta 10) has one-time binding built in:
https://docs.angularjs.org/guide/expression#one-time-binding
One-time binding
An expression that starts with :: is considered a one-time expression. One-time expressions will stop recalculating once they are stable, which happens after the first digest if the expression result is a non-undefined value (see value stabilization algorithm below).
Use the bindonce module. You'll need to include the JS file and add it as a dependency to your app module:
var myApp = angular.module("myApp", ['pasvaz.bindonce']);
This library allows you to render items that are bound only once — when they are first initialized. Any further updates to those values will be ignored. It's a great way to reduce the number of watches on the page for things that won't change after they are rendered.
Usage example:
<div bo-text="value"></div>
When used like this, the property under value
will be set once it is available, but then the watch will be disabled.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With