$watch()
<html> <head> <title>AngularJS Watch</title> <script src="lib/angular.js"></script> <script> var myapp = angular.module("myapp", []); var myController = myapp.controller("myController", function ($scope) { $scope.name = 'nikssangani.blogspot.in'; $scope.counter = 0; $scope.$watch('name', function (newValue, oldValue) { $scope.counter = $scope.counter + 1; }); }); </script> </head> <body ng-app="myapp" ng-controller="myController"> <input ng-model="name" type="text" /> Counter: </body> </html>
$digest()
The $digest() function is called whenever AngularJS thinks it is necessary. For example, after a button click, or after an AJAX call. You may have some corner cases where AngularJS does not call the $digest() function for you. In that case, you may have to call this function yourself.
<html> <head> <title>AngularJS Digest</title> <script src="lib/angular.js"></script> <script> var myapp = angular.module("myapp", []); var myController = myapp.controller("myController", function ($scope) { $scope.datetime = new Date(); $scope.updateTime = function () { $scope.datetime = new Date(); } document.getElementById("updateTimeButton").addEventListener('click', function () { console.log("update time clicked"); $scope.datetime = new Date(); console.log($scope.datetime); }); }); </script> </head> <body ng-app="myapp" ng-controller="myController"> <button ng-click="updateTime()">Update time - ng-click</button> <button id="updateTimeButton">Update time</button> <br /> </body> </html>When you will click on the second button, the data binding is not updated. Since $scope.$digest() is not called after the second button's event listener is executed. In this way of clicking the second button the time will be updated in the $scope.data.time variable, but the new time will never be displayed.
To fix this issue you need to add a $scope.$digest() call to the second button event listener, like this:
<script type="text/javascript"> document.getElementById("updateTimeButton").addEventListener('click', function () { console.log("update time clicked"); $scope.datetime = new Date(); //to update $scope $scope.$digest(); console.log($scope.datetime); });
</script>
$apply()
In above example, instead of calling $digest() function inside the button listener function you can used the $apply() function like this:
<script> document.getElementById("updateTimeButton").addEventListener('click', function () { $scope.$apply(function () { console.log("update time clicked"); $scope.datetime = new Date(); console.log($scope.datetime); }); }); </script>
Comments
Post a Comment