Angularjs中的$watch(二)

上次介绍了两种$watch的用法,今天在跟大家分享另外的几种用法。

$watch监听函数

将监听的参数部分换为函数。虽然监听的是函数,但实际上监听的是函数的返回值。

1
2
3
4
5
6
7
8
9
10
11
$scope.food = 1;
$scope.foodCounter = 0;
$scope.$watch(
function() { return $scope.food; },
function(newValue, oldValue) {
if (newValue !== oldValue) {
console.log(newValue);
$scope.foodCounter = $scope.foodCounter + 1;
}
}
);


然后让我们看一下我们监听的部分,看看是不是我们的返回值:

$watchGroup(watchExpressions, listener)

$watchGroup是scope上的另一个函数,他是$watch的功能扩展。他可以监听一个数组中的多个元素,当其中的人一个发生改变时,都会被监听到。

1
2
3
4
5
$scope.v1 = 'a';
$scope.v2 = 'a';
$scope.$watchGroup(['v1', 'v2'], function(newValues, oldValues) {
console.log(newValues, oldValues);
});



$watchCollection(obj, listener)

$watchCollection也是scope上的一个函数,同样为$watch的扩展。他可以监听一个对象,当对象中的任一个属性发生改变额时候,都会被监听到。

obj 部分同样可以是String或是function。

1
2
3
4
5
6
7
8
9
$scope.people = {
name: 'zhangsan',
sex: '男'
};
$scope.dataCount = 0;
$scope.$watchCollection('people', function(newValue) {
$scope.dataCount = $scope.dataCount + 1;
});


这个方法的功能跟使用$watch的第三个参数是一样的效果:当$watch的第三个参数为true的时候,就会实现这样的效果。

1
$scope.$watch('people', function(newValue) {}, true);

上一次我们已经提到过了,在这里使用true,表示新旧值将使用angular.equals来进行判等。在官方文档中有这么一句话:

Both objects or values are of the same type and all of their properties are equal by comparing them with angular.equals.

可以看到,这里的判等需要每个属性都相等。

总结

灵活的使用$watch以及相关的方法,会使你的展现的功能富有趣味,富有灵活性。

官方参考:https://docs.angularjs.org/api/ng/type/$rootScope.Scope#$watch

坚持原创技术分享,您的支持将鼓励我继续创作!