Измененное значение для службы 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() даже не требуется в этом примере.