浅谈angularJS的$watch失效问题的解决方案


Posted in Javascript onAugust 11, 2017

本文介绍了浅谈angularJS的$watch失效问题的解决方案,分享给大家,顺便给自己留个笔记

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

$watch 单一的变量

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

$scope.count=1;
$scope.$watch('count',function(){
...
});

$watch 多个变量

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

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

$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(){...});

$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;
});

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

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

取消$watch

watch的性能消耗好像蛮大的,所以对于已经不需要监视的watch,记得定时取消掉。

至于怎么取消了…查了好久才找到的

其实每个watch函数返回的结果就是这个watch的deregisterWatch()函数

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

所以啊,要取消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();
  }
});

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
javascript编程起步(第五课)
Jan 10 Javascript
jquery实用代码片段集合
Aug 12 Javascript
javascript类型转换使用方法
Feb 08 Javascript
jQuery实现防止提交按钮被双击的方法
Mar 24 Javascript
JavaScript数据存储 Cookie篇
Jul 02 Javascript
原生js开发的日历插件
Feb 04 Javascript
数组Array的排序sort方法
Feb 17 Javascript
vue项目中使用百度地图的方法
Jun 08 Javascript
微信小程序实现省市区三级地址选择
Jun 21 Javascript
Layui数据表格判断编辑输入的值,是否为我需要的类型详解
Oct 26 Javascript
vue excel上传预览和table内容下载到excel文件中
Dec 10 Javascript
Vue学习之常用指令实例详解
Jan 06 Javascript
EasyUI在Panel上动态添加LinkButton按钮
Aug 11 #Javascript
Javascript(es2016) import和require用法和区别详解
Aug 11 #Javascript
详解Node中导入模块require和import的区别
Aug 11 #Javascript
vue实现单选和多选功能
Aug 11 #Javascript
js微信应用场景之微信音乐相册案例分享
Aug 11 #Javascript
Angular模板表单校验方法详解
Aug 11 #Javascript
AngularJs导出数据到Excel的示例代码
Aug 11 #Javascript
You might like
PHP 微信支付类 demo
2015/11/30 PHP
详解php中生成标准uuid(guid)的方法
2019/04/28 PHP
php解决crontab定时任务不能写入文件问题的方法分析
2019/09/16 PHP
推荐dojo学习笔记
2007/03/24 Javascript
ASP中Sub和Function的区别说明
2020/08/30 Javascript
js的写法基础分析
2011/01/17 Javascript
利用JS延迟加载百度分享代码,提高网页速度
2013/07/01 Javascript
js拖动div 当鼠标移动时整个div也相应的移动
2013/11/21 Javascript
jquery 删除字符串最后一个字符的方法解析
2014/02/11 Javascript
使用原生js实现页面蒙灰(mask)效果示例代码
2014/06/20 Javascript
简单介绍JavaScript的变量和数据类型
2015/06/03 Javascript
NodeJS的Promise的用法解析
2016/05/05 NodeJs
JS弹出窗口插件zDialog简单用法示例
2016/06/12 Javascript
jQuery Validate验证框架详解(推荐)
2016/12/17 Javascript
jQuery使用Layer弹出层插件闪退问题
2016/12/22 Javascript
JavaScript数组操作详解
2017/02/04 Javascript
Vue监听数据对象变化源码
2017/03/09 Javascript
angularjs实现table表格td单元格单击变输入框/可编辑状态示例
2019/02/21 Javascript
面试题:react和vue的区别分析
2019/04/08 Javascript
深入理解JavaScript 箭头函数
2019/05/30 Javascript
[01:02]DOTA2辉夜杯决赛日 CDEC.Y对阵VG赛前花絮
2015/12/27 DOTA
[01:02:55]CHAOS vs Mineski 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/18 DOTA
Python删除windows垃圾文件的方法
2015/07/14 Python
Django 生成登陆验证码代码分享
2017/12/12 Python
Linux-ubuntu16.04 Python3.5配置OpenCV3.2的方法
2018/04/02 Python
解决项目pycharm能运行,在终端却无法运行的问题
2019/01/19 Python
解决django前后端分离csrf验证的问题
2019/02/03 Python
在PyCharm中遇到pip安装 失败问题及解决方案(pip失效时的解决方案)
2020/03/10 Python
html5默认气泡修改的代码详解
2020/03/13 HTML / CSS
法国低价在线宠物商店:bitiba.fr
2020/07/03 全球购物
军训生自我鉴定范文
2013/12/27 职场文书
个人收入证明范本
2014/01/12 职场文书
乡镇党的群众路线教育实践活动个人整改方案
2014/10/31 职场文书
2015年保育员个人工作总结
2015/05/13 职场文书
如何用PHP实现多线程编程
2021/05/26 PHP
详解Python函数print用法
2021/06/18 Python