$watch对象

2022-08-29 23:52:29

我想监视字典中的更改,但由于某种原因未调用监视回调。

这是我使用的控制器:

function MyController($scope) {
    $scope.form = {
        name: 'my name',
        surname: 'surname'
    }

    $scope.$watch('form', function(newVal, oldVal){
        console.log('changed');
    });
}

这是小提琴

我希望每次更改姓名或姓氏时都会触发$watch回调,但这不会发生。

正确的方法是什么?


答案 1

调用作为第三个参数:$watchtrue

$scope.$watch('form', function(newVal, oldVal){
    console.log('changed');
}, true);

默认情况下,在JavaScript中比较两个复杂对象时,将检查它们的“引用”相等性,该相等性询问两个对象是否引用同一事物,而不是“值”相等性,后者检查这些对象的所有属性的值是否相等。

根据 Angular 文档,第三个参数用于:objectEquality

当 手表表达式的不等式根据 angular.equals 函数确定时。要保存对象的值以供以后比较,请使用 angular.copy 函数。因此,这意味着监视复杂对象将对内存和性能产生不利影响。objectEquality == true


答案 2

对象未更改,只有属性formname

更新的小提琴

function MyController($scope) {
$scope.form = {
    name: 'my name',
}

$scope.changeCount = 0;
$scope.$watch('form.name', function(newVal, oldVal){
    console.log('changed');
    $scope.changeCount++;
});
}