Объект сторожевого обслуживания Angularjs
Почему я не могу смотреть объект в службе.
У меня есть простая переменная, но объект не работает.
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)
});
}]);
Ответы
Ответ 1
Вам нужно передать true как последний параметр функции $watch, чтобы проверка равенства была angular.equals. В противном случае проверяется только ссылочное равенство.
$scope.$watch('test.getData()', function(newVal){
console.log('data changes into: ', newVal)
}, true);
Дублирующий вопрос:
$смотреть объект
ИЗМЕНИТЬ
Как упоминалось ниже, код включает плохую практику - наличие службы, на которую ссылается $scope
. Нет необходимости ссылаться на него в области видимости, поскольку $watch
также принимает функцию геттера в качестве первого аргумента. Чистое решение использует эту функцию для возврата наблюдаемого массива, как указано в ниже.
$scope.$watch(function() { return test.getData(); } ...
Чтобы перечислить полное решение, вы также можете использовать $watchCollection
для решения проблемы проверки ссылочного равенства.
Ответ 2
инъекция целых сервисов в область не является чем-то, что я бы сделал.
Я бы предпочел посмотреть функцию, возвращающую значение:
$scope.$watch(function() { return test.getData(); }, function(newVal) {
/* Do the stuff */
}, true);