10

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

我有一个服务和两个指令。一个指令更改服务中的属性,另一个指令监视该属性。我希望在更改属性时手表会触发,但事实并非如此。

我在网站上看到了其他一些类似的问题,但他们接受的解决方案在这里不起作用。我考虑过使用 $broadcast 或尝试实现观察者,但看起来这应该可行,如果可能的话,我不想让事情变得过于复杂。

4

2 回答 2

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

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

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

顺便说一句,在这个例子中甚至不需要 angular.copy() 。

于 2013-11-08T02:07:37.837 回答
5

代替

this.currentObject = newObject;

利用

angular.copy(newObject, this.currentObject);

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

angular.copy() 修改了原始对象,所以 $watch 看到了这个变化。

于 2013-08-01T13:27:55.097 回答