我在让手表在指令中工作时遇到问题。我在这里整理了一个简单的例子。http://plnkr.co/edit/A7zbrsh8gJhdpM30ZH2P
我有一个服务和两个指令。一个指令更改服务中的属性,另一个指令监视该属性。我希望在更改属性时手表会触发,但事实并非如此。
我在网站上看到了其他一些类似的问题,但他们接受的解决方案在这里不起作用。我考虑过使用 $broadcast 或尝试实现观察者,但看起来这应该可行,如果可能的话,我不想让事情变得过于复杂。
我在让手表在指令中工作时遇到问题。我在这里整理了一个简单的例子。http://plnkr.co/edit/A7zbrsh8gJhdpM30ZH2P
我有一个服务和两个指令。一个指令更改服务中的属性,另一个指令监视该属性。我希望在更改属性时手表会触发,但事实并非如此。
我在网站上看到了其他一些类似的问题,但他们接受的解决方案在这里不起作用。我考虑过使用 $broadcast 或尝试实现观察者,但看起来这应该可行,如果可能的话,我不想让事情变得过于复杂。
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() 。
代替
this.currentObject = newObject;
利用
angular.copy(newObject, this.currentObject);
使用原始代码,viewer
指令正在监视原始对象,{}
. 当currentObject
设置为newObject
时,$watch 仍在寻找对原始对象的更改,而不是newObject
。
angular.copy() 修改了原始对象,所以 $watch 看到了这个变化。