浅谈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 相关文章推荐
IE6,IE7,IE8下使用Javascript记录光标选中范围(已补全)
Aug 28 Javascript
appendChild() 或 insertBefore()使用与区别介绍
Oct 11 Javascript
查看大图功能代码jquery版
Nov 05 Javascript
javascript实现图片跟随鼠标移动效果的方法
May 13 Javascript
基于JavaScript怎么实现让歌词滚动播放
Nov 03 Javascript
ThinkJS中如何使用MongoDB的CURD操作
Dec 13 Javascript
微信小程序 弹框和模态框实现代码
Mar 10 Javascript
Vue2.0权限树组件实现代码
Aug 29 Javascript
浅谈vue首屏加载优化
Jun 28 Javascript
JQuery搜索框自动补全(模糊匹配)功能实现示例
Jan 08 jQuery
Vue+ElementUI项目使用webpack输出MPA的方法
Aug 27 Javascript
JavaScript分页组件使用方法详解
Jul 26 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数组函数序列之rsort() - 对数组的元素值进行降序排序
2011/11/02 PHP
phpmailer发送邮件之后,返回收件人是否阅读了邮件的方法
2014/07/19 PHP
laravel 5 实现模板主题功能(续)
2015/03/02 PHP
PHP中include和require的区别实例分析
2017/05/07 PHP
jQuery live
2009/05/15 Javascript
jquery select(列表)的操作(取值/赋值)
2009/08/06 Javascript
关于juqery radio写法的兼容性问题(新老版本jquery)
2010/06/14 Javascript
js读取csv文件并使用json显示出来
2015/01/09 Javascript
针对BootStrap中tabs控件的美化和完善(推荐)
2016/07/06 Javascript
深入理解Angularjs中的$resource服务
2016/12/31 Javascript
JS组件系列之JS组件封装过程详解
2017/04/28 Javascript
js上传图片预览的实现方法
2017/05/09 Javascript
js+html5实现侧滑页面效果
2017/07/15 Javascript
浅谈Angular4中常用管道
2017/09/27 Javascript
Vue弹出菜单功能的实现代码
2018/09/12 Javascript
vue给对象动态添加属性和值的实例
2019/09/09 Javascript
[03:26]回顾2015国际邀请赛中国区预选赛
2015/06/09 DOTA
python杀死一个线程的方法
2015/09/06 Python
Django实现的自定义访问日志模块示例
2017/06/23 Python
Python生成器的使用方法和示例代码
2019/03/04 Python
PyQt5实现简单数据标注工具
2019/03/18 Python
Python实现变声器功能(萝莉音御姐音)
2019/12/05 Python
Python Websocket服务端通信的使用示例
2020/02/25 Python
Canvas制作旋转的太极的示例
2018/03/09 HTML / CSS
浅谈基于Canvas的手绘风格图形库Rough.js
2018/03/19 HTML / CSS
Laura官网:加拿大女性的顶级时尚目的地
2019/09/20 全球购物
简单说说tomcat的配置
2013/05/28 面试题
酒店前台接待岗位职责
2013/12/03 职场文书
幼儿教育感言
2014/02/05 职场文书
给老婆大人的检讨书
2014/02/24 职场文书
骨干教师事迹材料
2014/12/17 职场文书
2015年乡镇卫生院工作总结
2015/04/22 职场文书
检讨书范文
2019/04/16 职场文书
导游词之黄帝陵景区
2019/09/16 职场文书
浅析JavaScript中的变量提升
2022/06/01 Javascript
django项目、vue项目部署云服务器的详细过程
2022/07/23 Servers