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

Ian*_*uir 10 angularjs angularjs-directive angularjs-scope

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

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

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

tan*_*y_k 28

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

你需要$ 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
);
Run Code Online (Sandbox Code Playgroud)

这里有适用的插件:http://plnkr.co/edit/0mav32?p = preview

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

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

  • 完美答案.这是正确的方法. (2认同)

Mar*_*cok 5

代替

this.currentObject = newObject;
Run Code Online (Sandbox Code Playgroud)

使用

angular.copy(newObject, this.currentObject);
Run Code Online (Sandbox Code Playgroud)

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

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