Измененное значение для службы AngularJS не вызывает часы в директиве

У меня возникла проблема с тем, чтобы часы работали в рамках директивы. Я собрал здесь простой пример. http://plnkr.co/edit/A7zbrsh8gJhdpM30ZH2P

У меня есть служба и две директивы. Одна директива изменяет свойство в сервисе, а другая директива имеет часы для этого свойства. Я ожидал, что часы будут стрелять, когда имущество будет изменено, но это не так.

Я видел несколько других вопросов, подобных этому на сайте, но принятые решения на них здесь не работали. Я рассмотрел использование $broadcast или попытку реализовать наблюдателя, но похоже, что это должно сработать, и я не хочу усложнять ситуацию, если это возможно.

Ответ 1

Вместо

this.currentObject = newObject;

использование

angular.copy(newObject, this.currentObject);

С исходным кодом директива viewer смотрит исходный объект {}. Если для параметра currentObject установлено значение newObject, $watch все еще ищет изменение исходного объекта, а не newObject.

angular.copy() изменяет исходный объект, поэтому $watch видит это изменение.

Ответ 2

Ответ Марка Райкока не завершен. Даже с angular.copy(), $watch listener будет вызываться один раз и никогда больше.

Вам нужно смотреть функцию:

$scope.$watch(

  // This is the important part
  function() {
    return demoService.currentObject;
  },

  function(newValue, oldValue) {
    console.log('demoService.currentObject has been changed');
    // Do whatever you want with demoService.currenctObject
  },
  true
);

Здесь работает плункер: http://plnkr.co/edit/0mav32?p=preview

Откройте консоль вашего браузера, чтобы узнать, как и директива, и demoService2 будут уведомлены об изменениях demoService.currentObject.

И btw angular.copy() даже не требуется в этом примере.