浅谈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 相关文章推荐
jquery异步循环获取功能实现代码
Sep 19 Javascript
JavaScript 类型的包装对象(Typed Wrappers)
Oct 27 Javascript
jquery实现邮箱自动补全功能示例分享
Feb 17 Javascript
javascript运动详解
Jul 06 Javascript
理解JavaScript表单的基础知识
Jan 25 Javascript
自制微信公众号一键排版工具
Sep 22 Javascript
详解node Async/Await 更好的异步编程解决方案
May 10 Javascript
JS重学系列之聊聊new操作符
Mar 04 Javascript
JS面向对象之多选框实现
Jan 17 Javascript
javascript 设计模式之组合模式原理与应用详解
Apr 08 Javascript
Javascript异步执行不按顺序解决方案
Apr 30 Javascript
js 动态校验开始结束时间的实现代码
May 25 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中“=>
2019/03/01 PHP
PHP文件上传小程序 适合初学者学习!
2019/05/23 PHP
PHP实现的多进程控制demo示例
2019/07/22 PHP
php-fpm超时时间设置request_terminate_timeout资源问题分析
2019/09/27 PHP
jQuery的一些特性和用法整理小结
2010/01/13 Javascript
jquery autocomplete自动完成插件的的使用方法
2010/08/07 Javascript
IE6下focus与blur错乱的解决方案
2011/07/31 Javascript
使用javascript实现有效时间的控制,并显示将要过期的时间
2014/01/02 Javascript
使用原生js写的一个简单slider
2014/04/29 Javascript
javascript编写实用的省市选择器
2015/02/12 Javascript
jquery结婚电子请柬特效源码分享
2015/08/21 Javascript
js和jquery分别验证单选框、复选框、下拉框
2015/12/17 Javascript
基于JavaScript实现 网页切出 网站title变化代码
2016/04/03 Javascript
jQuery1.9+中删除了live以后的替代方法
2016/06/17 Javascript
Bootstrap零基础学习第一课之模板
2016/07/18 Javascript
vue元素实现动画过渡效果
2017/07/01 Javascript
vue+element的表格实现批量删除功能示例代码
2018/08/17 Javascript
使用Sonarqube扫描Javascript代码的示例
2018/12/26 Javascript
vuex中遇到的坑,vuex数据改变,组件中页面不渲染操作
2020/11/16 Javascript
Python时间获取及转换知识汇总
2017/01/11 Python
Python数据结构与算法之图的广度优先与深度优先搜索算法示例
2017/12/14 Python
使用django-guardian实现django-admin的行级权限控制的方法
2018/10/30 Python
使用Python刷淘宝喵币(低阶入门版)
2019/10/30 Python
Django自关联实现多级联动查询实例
2020/05/19 Python
关于python的缩进规则的知识点详解
2020/06/22 Python
Clearly澳大利亚:购买眼镜、太阳镜和隐形眼镜
2018/04/26 全球购物
网络工程师面试(三木通信技术有限公司)
2013/06/05 面试题
大二法学专业职业生涯规划范文
2014/02/12 职场文书
小学三年级学生评语
2014/04/22 职场文书
公司离职证明范本(5篇)
2014/09/17 职场文书
2014年技术部工作总结
2014/12/12 职场文书
2015年企业工作总结范文
2015/04/28 职场文书
工作服管理制度范本
2015/08/06 职场文书
先进工作者主要事迹材料
2015/11/03 职场文书
铁拳制作人赞《铁拳7》老头环Mod:制作精良 但别弄了
2022/04/03 其他游戏
CentOS7设置ssh服务以及端口修改方式
2022/12/24 Servers