浅谈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 相关文章推荐
新页面打开实际尺寸的图片
Aug 25 Javascript
javascript for循环从入门到偏门(效率优化+奇特用法)
Aug 01 Javascript
js模仿windows桌面图标排列算法具体实现(附图)
Jun 16 Javascript
JQuery伸缩导航练习示例
Nov 13 Javascript
js jquery分别实现动态的文件上传操作按钮的添加和删除
Jan 13 Javascript
window.returnValue使用方法示例介绍
Jul 03 Javascript
webapp框架AngularUI的demo改造之路
Dec 21 Javascript
PHP+MySQL+jQuery随意拖动层并即时保存拖动位置实例讲解
Oct 09 Javascript
jQuery中iframe的操作(点击按钮新增窗口)
Apr 20 Javascript
js捆绑TypeScript声明文件的方法教程
Apr 13 Javascript
node打造微信个人号机器人的方法示例
Apr 26 Javascript
vue中的自定义分页插件组件的示例
Aug 18 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
Smarty模板快速入门
2007/01/04 PHP
PHP 截取字符串函数整理(支持gb2312和utf-8)
2010/02/16 PHP
PHP 反射(Reflection)使用实例
2015/05/12 PHP
php基于PDO实现功能强大的MYSQL封装类实例
2017/02/27 PHP
jQuery学习笔记之jQuery的DOM操作
2010/12/22 Javascript
js自定义事件及事件交互原理概述(二)
2013/02/01 Javascript
Javascript算符的优先级介绍
2013/03/20 Javascript
jquery阻止冒泡事件使用模拟事件
2013/09/06 Javascript
jquery ajax 简单范例(界面+后台)
2013/11/19 Javascript
jquery form表单序列化为对象的示例代码
2014/03/05 Javascript
from表单多个按钮提交用onclick跳转不同action
2014/04/24 Javascript
分析了一下JQuery中的extend方法实现原理
2015/02/27 Javascript
Javascript生成带参数的二维码示例
2016/10/10 Javascript
Vue.js 2.0窥探之Virtual DOM到底是什么?
2017/02/10 Javascript
js轮播图透明度切换(带上下页和底部圆点切换)
2017/04/27 Javascript
ReactNative之键盘Keyboard的弹出与消失示例
2017/07/11 Javascript
ES6正则表达式扩展笔记
2017/07/25 Javascript
js微信应用场景之微信音乐相册案例分享
2017/08/11 Javascript
利用pm2部署多个node.js项目的配置教程
2017/10/22 Javascript
在Swiper内如何制作CSS3动画效果示例代码
2017/12/07 Javascript
解决VUE中document.body.scrollTop为0的问题
2018/09/15 Javascript
React中使用外部样式的3种方式(小结)
2019/05/28 Javascript
详解一次Vue低版本安卓白屏问题的解决过程
2019/05/30 Javascript
Vue页面跳转传递参数及接收方式
2020/09/09 Javascript
[47:42]Fnatic vs Liquid 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
在arcgis使用python脚本进行字段计算时是如何解决中文问题的
2015/10/18 Python
Python使用百度api做人脸对比的方法
2019/08/28 Python
Django 再谈一谈json序列化
2020/03/16 Python
网站性能延迟加载图像的五种技巧(小结)
2020/08/13 HTML / CSS
安全教育演讲稿
2014/05/09 职场文书
政府信息公开实施方案
2014/05/09 职场文书
离婚协议书怎么写(范本参考)
2014/09/30 职场文书
网络工程专业大学生求职信
2014/10/01 职场文书
2014年优秀班主任工作总结
2014/12/16 职场文书
Golang使用Panic与Recover进行错误捕获
2022/03/22 Golang
3050和2060哪个好 性能差多少 差距有多大 谁更有性价比
2022/06/17 数码科技