Why can't I watch a object in a service. Ive got a simple variable working, but a object wont work. http://plnkr.co/edit/S4b2g3baS7dwQt3t8XEK?p=preview
var app = angular.module('plunker', []);
app.service('test', ['$http', '$rootScope',
function ($http, $rootScope) {
var data = 0;
var obj = {
"data": 0
};
this.add = function(){
obj.data += 1;
console.log('data:', obj);
};
this.getData = function() { return obj; };
}]);
app.controller('TestController', ['$scope', '$rootScope', '$filter', 'test',
function($scope, $rootScope, $filter, test) {
//test controller
$scope.add = function(){
test.add();
};
$scope.test = test;
$scope.$watch('test.getData()', function(newVal){
console.log('data changes into: ', newVal)
});
}]);
injecting whole services into a scope is not something I would do.
I would prefer to watch a function returning the value :
$scope.$watch(function() { return test.getData(); }, function(newVal) {
/* Do the stuff */
}, true);
You need to pass true as the last parameter of the $watch function so that the equality check is angular.equals. Otherwise only reference equality is checked.
$scope.$watch('test.getData()', function(newVal){
console.log('data changes into: ', newVal)
}, true);
Duplicate question: $watch an object
EDIT
As mentioned bellow, the code includes a bad practice – having a service referenced in $scope
. It is not necessary to reference it in scope, since $watch
also accepts a getter function as first argument. Clean solution uses this function to return the watched array as is in the answer below.
$scope.$watch(function() { return test.getData(); } ...
To list a complete solution you could also use $watchCollection
instead to solve the reference equality check problem.
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