Angular.js中使用$watch监听模型变化
2017-03-20 00:00
615 查看
$watch简单使用
$watch是一个scope函数,用于监听模型变化,当你的模型部分发生变化时它会通知你。
$watch(watchExpression, listener, objectEquality);
每个参数的说明如下:
watchExpression:监听的对象,它可以是一个angular表达式如'name',或函数如function(){return $scope.name}。
listener:当watchExpression变化时会被调用的函数或者表达式,它接收3个参数:newValue(新值), oldValue(旧值), scope(作用域的引用)
objectEquality:是否深度监听,如果设置为true,它告诉Angular检查所监控的对象中每一个属性的变化. 如果你希望监控数组的个别元素或者对象的属性而不是一个普通的值, 那么你应该使用它
举个栗子:
$scope.name = 'hello';
var watch = $scope.$watch('name',function(newValue,oldValue, scope){
console.log(newValue);
console.log(oldValue);
});
$timeout(function(){
$scope.name = "world";
},1000);
$watch性能问题
太多的$watch将会导致性能问题,$watch如果不再使用,我们最好将其释放掉。
$watch函数返回一个注销监听的函数,如果我们想监控一个属性,然后在稍后注销它,可以使用下面的方式:
var watch = $scope.$watch('someModel.someProperty', callback);
//...
watch();
还有2个和$watch相关的函数:
$watchGroup(watchExpressions, listener);
$watchCollection(obj, listener);
1
2
3
4
1
2
3
4
1
2
3
4
5
6
1
2
3
4
5
6
当第三个参数是false时,其实watch函数监视的是数组的地址,而数组的内容的变化不会影响数组地址的变化,所以watch函数失灵了。
解决办法,就是在后面添加第三个参数为true就好(当然,也可以将这监听返回结果为JSON字符串形式的该对象或数组的的匿名函数。)
1
2
3
4
5
1
2
3
4
5
或者将监听返回结果为JSON字符串形式的该对象或数组的的匿名函数
1
2
3
4
5
6
7
1
2
3
4
5
6
7
方法1:监视对象为“函数名()”的字符串,记得加“()”!
1
2
3
4
5
6
7
8
9
10
11
12
1
2
3
4
5
6
7
8
9
10
11
12
方法2:在监视对象中设置为匿名函数,返回要监视的函数的返回值(绕晕了…)
1
2
3
4
5
1
2
3
4
5
至于怎么取消了…查了好久才找到的
其实每个watch函数返回的结果就是这个watch的deregisterWatch()函数
1
2
3
4
5
1
2
3
4
5
所以啊,要取消watch的话,一开始将$watch的返回值保存就好啦,要取消watch的时候,在调用。
$watch是一个scope函数,用于监听模型变化,当你的模型部分发生变化时它会通知你。
$watch(watchExpression, listener, objectEquality);
每个参数的说明如下:
watchExpression:监听的对象,它可以是一个angular表达式如'name',或函数如function(){return $scope.name}。
listener:当watchExpression变化时会被调用的函数或者表达式,它接收3个参数:newValue(新值), oldValue(旧值), scope(作用域的引用)
objectEquality:是否深度监听,如果设置为true,它告诉Angular检查所监控的对象中每一个属性的变化. 如果你希望监控数组的个别元素或者对象的属性而不是一个普通的值, 那么你应该使用它
举个栗子:
$scope.name = 'hello';
var watch = $scope.$watch('name',function(newValue,oldValue, scope){
console.log(newValue);
console.log(oldValue);
});
$timeout(function(){
$scope.name = "world";
},1000);
$watch性能问题
太多的$watch将会导致性能问题,$watch如果不再使用,我们最好将其释放掉。
$watch函数返回一个注销监听的函数,如果我们想监控一个属性,然后在稍后注销它,可以使用下面的方式:
var watch = $scope.$watch('someModel.someProperty', callback);
//...
watch();
还有2个和$watch相关的函数:
$watchGroup(watchExpressions, listener);
$watchCollection(obj, listener);
$watch 单一的变量
对于普通的变量时,如数字,字符串等,直接如下写是可以监视到变量的变化,并执行相应的函数的。$scope.count=1; $scope.$watch('count',function(){ ... });
1
2
3
4
1
2
3
4
$watch 多个变量
对于多个变量的监视变化,执行同一函数的话,可以将这几个变量转为字符串,以‘+’号隔开来进行监视//当count或page变化时,都会执行这个匿名函数 $scope.count=1; $scope.page=1; $scope.$watch('count + page',function(){ ... });
1
2
3
4
5
6
1
2
3
4
5
6
$watch对象或数组
发现用上面两种方法去监视数组时,会发现即使数组的内容改变了,也没有触发到这个匿名函数。之后发现watch函数其实是有三个变量的,第一个参数是需要监视的对象,第二个参数是在监视对象发生变化时需要调用的函数,实际上watch还有第三个参数,它在默认情况下是false。当第三个参数是false时,其实watch函数监视的是数组的地址,而数组的内容的变化不会影响数组地址的变化,所以watch函数失灵了。
解决办法,就是在后面添加第三个参数为true就好(当然,也可以将这监听返回结果为JSON字符串形式的该对象或数组的的匿名函数。)
$scope.items=[ {a:1}, {a:2} {a:3}]; $scope.$watch('items',function(){...},true);
1
2
3
4
5
1
2
3
4
5
或者将监听返回结果为JSON字符串形式的该对象或数组的的匿名函数
$scope.items=[ {a:1}, {a:2} {a:3}]; $scope.$watch(function(){ return JSON.stringify($scope.items); },function(){...});
1
2
3
4
5
6
7
1
2
3
4
5
6
7
$watch 函数的返回结果
在写代码的时候,有时会遇到要监视一个函数返回的结果是否变化的情况,所以查了一下$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; });
1
2
3
4
5
6
7
8
9
10
11
12
1
2
3
4
5
6
7
8
9
10
11
12
方法2:在监视对象中设置为匿名函数,返回要监视的函数的返回值(绕晕了…)
$scope.$watch(function(){ return $scope.unDoneCount();//不要忘了(),要执行的啊~ }, function(nv) { $scope.isDoneAll = nv ? false : true; });
1
2
3
4
5
1
2
3
4
5
取消$watch
watch的性能消耗好像蛮大的,所以对于已经不需要监视的watch,记得定时取消掉。至于怎么取消了…查了好久才找到的
其实每个watch函数返回的结果就是这个watch的deregisterWatch()函数
//在chrome的控制台上,断点得到的$watch的返回值 function deregisterWatch() { arrayRemove(array, watcher); lastDirtyWatch = null; }
1
2
3
4
5
1
2
3
4
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(); } });
相关文章推荐
- Angular.js中使用$watch监听模型变化 (转载)
- Angular.js中使用$watch监听模型变化
- Angular.js中使用$watch监听模型变化
- Angular.js中使用$watch监听模型变化
- 浅谈Angular.js中使用$watch监听模型变化
- Angular.js中使用$watch监听模型变化
- Angular.js中使用$watch监听模型变化
- angularjs $watch监听模型变化
- angualar.js指令与控制器间的通信(@、=、&)以及在指令内部使用$watch监听参数变化
- Angular中使用$watch监听object属性值的变化
- Angular中使用$watch监听object属性值的变化(详解)
- angularJS使用$watch监控数据模型的变化
- vue.js使用watch监听路由变化的方法
- angularJS $scope的$watch方法监听model改变
- ANGULAR JS WATCH监听使用
- 使用Node.JS监听文件夹变化
- Angular中的$watch可以监听属性值的变化
- 使用Node.JS监听文件夹变化
- 使用js监听手机端输入法的变化
- angularjs $scope.$watch(),监听值得变化