Объект сторожевого обслуживания 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);