更改属性时未触发$ watch的对象

时间:2013-10-21 15:35:32

标签: javascript angularjs angularjs-scope angularjs-controller

我有一个对象:

$scope.obj = {bar: 'bar value', foo: 'foo value'};

我想知道bar,foo或两者是否都有变化。

我这样做:

$scope.$watch('obj', function() { console.log("watching obj") });

并且如果我更改对象的属性“观看obj”消息它永远不会显示。但是,如果我看'obj.foo''obj.bar',我就会看到该消息。所以,问题是:

为什么在观看'obj'时消息未显示?我该怎么做?

plunker更好地展示了问题......

2 个答案:

答案 0 :(得分:3)

您需要将objectEquality参数设置为true

http://docs.angularjs.org/api/ng。$ rootScope.Scope

// $ watch(watchExpression,listener,objectEquality)

$scope.$watch('obj', function() {
    console.log("watching obj")
}, true);

答案 1 :(得分:0)

我将添加@ moderndegree的答案,

如果您要观看的对象有少量元素(在这种情况下只有两个),您也可以使用

$scope.$watch('obj.foo+obj.bar', function() {
    console.log("changed");
});

这比深度观看更有效。