4个使用方式 1个取消方式
$watch使用教程 如下:
$scope.name = "Angular";$scope.updated = -1;$scope.$watch('name', function(newValue, oldValue) { console.log(newValue,oldValue) if (newValue === oldValue) { return; } // AKA first run $scope.updated++;});
2.$watch 多个变量
//当count或page变化时,都会执行这个匿名函数
$scope.count=1;
$scope.page=1;
$scope.$watch('count + page',function(){
...
});
3.$watch对象或数组
watch函数其实是有三个变量的,第一个参数是需要监视的对象,第二个参数是在监视对象发生变化时需要调用的函数,实际上
watch还有第三个参数,它在默认情况下是false。
当第三个参数是false时,其实
watch函数监视的是数组的地址,而数组的内容的变化不会影响数组地址的变化,所以
watch函数失灵了。
解决办法,就是在后面添加第三个参数为true就好(当然,也可以将这监听返回结果为JSON字符串形式的该对象或数组的的匿名函数。)
$scope.items=[
{a:1},
{a:2}
{a:3}];
$scope.$watch('items',function(){...},true);
或者将监听返回结果为JSON字符串形式的该对象或数组的的匿名函数
$scope.items=[
{a:1},
{a:2}
{a:3}];
$scope.$watch(function(){
return JSON.stringify($scope.items);
},function(){...});
4.$watch 函数的返回结果
方法1:监视对象为“函数名()”的字符串,记得加“()”!
//未完成的任务个数
$scope.unDoneCount = function() {
var count = 0;
angular.forEach($scope.todoList, function(todo) {
count += todo.done ? 0 : 1;
});
return count;
};
//单选影响全选部分
$scope.$watch('unDoneCount()', function(nv) {
$scope.isDoneAll = nv ? false : true;
});
5.取消$watch
watch的性能消耗好像蛮大的,所以对于已经不需要监视的
watch,记得定时取消掉
var count=1;
var unbingWatch=$scope.$watch('todoList',function(){
console.log('todoList change');
count++;
//相当于在todoList变化了4次之后,就调用unbingWatch()取消这个watch
//在第5次todoList改变的时候,就不会输出todoList change了。
if(count>4){
unbingWatch();
}
});
所以啊,要取消watch的话,一开始将$watch的返回值保存就好啦,要取消watch的时候,在调用。