angularjs广播对服务中对象的更改

时间:2014-06-03 16:10:28

标签: javascript angularjs

假设我有一个返回具有一些值的对象的服务。这是我的设置对象。我在controller 1中使用此服务来获取对象的值并将其分配给$scope。在controller2中,我使用相同的服务向对象添加更多值。现在我需要controller1才能意识到已经进行了这些更改并相应地更新了$scope

我尝试在$watch中使用controller1,如此

$scope.$watch(myservice.settings, function(oldvalue,newvalue) {
    console.log(newvalue);
});

但似乎在controller2中更新对象时不会运行摘要循环。除了手动运行$digest周期,据我所知,这通常是不好的,我还能如何获得我正在寻找的功能呢?

1 个答案:

答案 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)的优势在于它更便宜。