假设我有一个返回具有一些值的对象的服务。这是我的设置对象。我在controller 1
中使用此服务来获取对象的值并将其分配给$scope
。在controller2
中,我使用相同的服务向对象添加更多值。现在我需要controller1
才能意识到已经进行了这些更改并相应地更新了$scope
。
我尝试在$watch
中使用controller1
,如此
$scope.$watch(myservice.settings, function(oldvalue,newvalue) {
console.log(newvalue);
});
但似乎在controller2中更新对象时不会运行摘要循环。除了手动运行$digest
周期,据我所知,这通常是不好的,我还能如何获得我正在寻找的功能呢?
答案 0 :(得分:0)
$watch
接受一个函数,该函数返回要作为表达式求值的值或字符串:
除非您将true
作为第三个参数传递,否则它也不会处理对象的内部比较:
$scope.$watch('myservice.settings', function(oldvalue,newvalue) {
console.log(newvalue);
}, true);
这将使用angular.equals
执行深度比较,而不是比较参考相等性,这是默认值。如果您只需要执行浅层比较(即您的对象只有一个深度),则可以使用$watchCollection
代替:
$scope.$watchCollection('myservice.settings', function(oldvalue,newvalue) {
console.log(newvalue);
});
$watchCollection
优于$watch(func, func, true)
的优势在于它更便宜。