$watch ---angular

$watch方法,它可以帮助我们在每个scope中监视其中的变量。

$watch 单一的变量

对于普通的变量时,如数字,字符串等,直接如下写是可以监视到变量的变化,并执行相应的函数的。

  1.   $scope.count=1;
  2.   $scope.$watch('count',function(){
  3.   ...
  4.   });
  • 1
  • 2
  • 3
  • 4

$watch 多个变量

对于多个变量的监视变化,执行同一函数的话,可以将这几个变量转为字符串,以‘+’号隔开来进行监视

  1.   //当count或page变化时,都会执行这个匿名函数
  2.   $scope.count=1;
  3.   $scope.page=1;
  4.   $scope.$watch('count + page',function(){
  5.   ...
  6.   });
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

$watch对象或数组

发现用上面两种方法去监视数组时,会发现即使数组的内容改变了,也没有触发到这个匿名函数。之后发现watch还有第三个参数,它在默认情况下是false。 
当第三个参数是false时,其实watch函数失灵了。 
解决办法,就是在后面添加第三个参数为true就好(当然,也可以将这监听返回结果为JSON字符串形式的该对象或数组的的匿名函数。)

  1.   $scope.items=[
  2.   {a:1},
  3.   {a:2}
  4.   {a:3}];
  5.   $scope.$watch('items',function(){...},true);
  • 1
  • 2
  • 3
  • 4
  • 5

或者将监听返回结果为JSON字符串形式的该对象或数组的的匿名函数

  1.   $scope.items=[
  2.   {a:1},
  3.   {a:2}
  4.   {a:3}];
  5.   $scope.$watch(function(){
  6.   return JSON.stringify($scope.items);
  7.   },function(){...});
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

$watch 函数的返回结果

在写代码的时候,有时会遇到要监视一个函数返回的结果是否变化的情况,所以查了一下$watch 监视函数的情况。

方法1:监视对象为“函数名()”的字符串,记得加“()”!

  1.   //未完成的任务个数
  2.   $scope.unDoneCount = function() {
  3.   var count = 0;
  4.   angular.forEach($scope.todoList, function(todo) {
  5.   count += todo.done ? 0 : 1;
  6.   });
  7.   return count;
  8.   };
  9.   //单选影响全选部分
  10.   $scope.$watch('unDoneCount()', function(nv) {
  11.   $scope.isDoneAll = nv ? false : true;
  12.   });
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

方法2:在监视对象中设置为匿名函数,返回要监视的函数的返回值(绕晕了…)

  1.   $scope.$watch(function(){
  2.   return $scope.unDoneCount();//不要忘了(),要执行的啊~
  3.   }, function(nv) {
  4.   $scope.isDoneAll = nv ? false : true;
  5.   });
  • 1
  • 2
  • 3
  • 4
  • 5

取消$watch

watch,记得定时取消掉。 
至于怎么取消了…查了好久才找到的 
其实每个watch的deregisterWatch()函数

  1.   //在chrome的控制台上,断点得到的$watch的返回值
  2.   function deregisterWatch() {
  3.   arrayRemove(array, watcher);
  4.   lastDirtyWatch = null;
  5.   }
  • 1
  • 2
  • 3
  • 4
  • 5

所以啊,要取消watch的话,一开始将$watch的返回值保存就好啦,要取消watch的时候,在调用。

  1.   var count=1;
  2.   var unbingWatch=$scope.$watch('todoList',function(){
  3.   console.log('todoList change');
  4.   count++;
  5.   //相当于在todoList变化了4次之后,就调用unbingWatch()取消这个watch
  6.   //在第5次todoList改变的时候,就不会输出todoList change了。
  7.   if(count>4){
  8.   unbingWatch();
  9.   }
  10.   });
 
上一篇:《*术:怎样有逻辑地说服他人》- 高德_epub+azw3+mobi+pdf+txt版手机电子书下载


下一篇:angular中的路由详解(1)—默认路由的用法