Sunday, 13 November 2016

How to deep watch an array in angularjs?



There is an array of objects in my scope, I want to watch all the values of each object.



This is my code:




function TodoCtrl($scope) {
$scope.columns = [
{ field:'title', displayName: 'TITLE'},
{ field: 'content', displayName: 'CONTENT' }
];
$scope.$watch('columns', function(newVal) {
alert('columns changed');
});
}



But when I modify the values, e.g. I change TITLE to TITLE2, the alert('columns changed') never popped.



How to deep watch the objects inside an array?



There is a live demo: http://jsfiddle.net/SYx9b/


Answer





You can set the 3rd argument of $watch to true:




$scope.$watch('data', function (newVal, oldVal) { /*...*/ }, true);


See https://docs.angularjs.org/api/ng/type/$rootScope.Scope#$watch



Since Angular 1.1.x you can also use $watchCollection to watch shallow watch (just the "first level" of) the collection.



$scope.$watchCollection('data', function (newVal, oldVal) { /*...*/ });



See https://docs.angularjs.org/api/ng/type/$rootScope.Scope#$watchCollection


No comments:

Post a Comment

c++ - Does curly brackets matter for empty constructor?

Those brackets declare an empty, inline constructor. In that case, with them, the constructor does exist, it merely does nothing more than t...