我想观察字典中的变化,但由于某种原因,手表回调没有被调用。
这是我使用的一个控制器:
function MyController($scope) {
$scope.form = {
name: 'my name',
surname: 'surname'
}
$scope.$watch('form', function(newVal, oldVal){
console.log('changed');
});
}
这是小提琴。
我期望$watch回调在每次更改姓名或姓氏时被触发,但它没有发生。
正确的做法是什么?
你的代码不能工作的原因是因为$watch默认执行引用检查。简而言之,它确保传递给它的对象是new object。但在你的例子中,你只是修改了form object的一些属性,而不是创建一个新的。为了使它工作,你可以传递true作为第三个参数。
$scope.$watch('form', function(newVal, oldVal){
console.log('invoked');
}, true);
它将工作,但你可以使用$watchCollection,这将比$watch更有效,因为$watchCollection将监视窗体对象上的浅属性。如。
$scope.$watchCollection('form', function (newVal, oldVal) {
console.log(newVal, oldVal);
});
用true作为第三个参数调用$watch:
$scope.$watch('form', function(newVal, oldVal){
console.log('changed');
}, true);
默认情况下,在JavaScript中比较两个复杂对象时,它们将被检查是否“引用”相等,即询问两个对象是否指向同一个对象,而不是“值”相等,即检查这些对象的所有属性的值是否相等。
根据Angular文档,第三个参数是objectEquality:
当objectEquality == true时,watchExpression的不等式根据角度确定。=函数。为了保存对象的值以供以后比较,使用angular。使用拷贝功能。因此,这意味着观看复杂的物体会对记忆和表现产生不利影响。