更改AngularJS Service上的值不会触发指令内的监视

时间:2013-08-01 13:19:45

标签: angularjs angularjs-directive angularjs-scope

我遇到了让手表在指令中工作的问题。我在这里举了一个简单的例子。 http://plnkr.co/edit/A7zbrsh8gJhdpM30ZH2P

我有一个服务和两个指令。一个指令更改服务中的属性,另一个指令在该属性上有一个监视。我希望手表能在房产改变后开火,但事实并非如此。

我在网站上看到过这样的其他几个问题,但是他们接受的解决方案在这里没有用。我考虑使用$ broadcast或尝试实现一个观察者,但似乎这应该有用,如果可能的话我不想让事情复杂化。

2 个答案:

答案 0 :(得分:28)

Mark Rajkok的回答不完整。即使使用angular.copy(),$ watch监听器也会被调用一次,而不会再被调用。

你需要$观看一个功能:

$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
);

这里有效的plunker:http://plnkr.co/edit/0mav32?p=preview

打开浏览器控制台,看看指令和demoService2都会收到有关demoService.currentObject更改的通知。

在这个例子中甚至不需要btw angular.copy()。

答案 1 :(得分:5)

而不是

this.currentObject = newObject;

使用

angular.copy(newObject, this.currentObject);

使用原始代码,viewer指令正在观察原始对象{}。当currentObject设置为newObject时,$ watch仍在寻找原始对象的更改,而不是newObject

angular.copy()修改原始对象,因此$ watch会看到该更改。