浅谈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 更新 JavaScript 数组的 uniq 方法
Jan 23 Javascript
RGB颜色值转HTML十六进制(HEX)代码的JS函数
Apr 25 Javascript
js以对象为索引的关联数组
Jul 04 Javascript
40款非常棒的jQuery 插件和制作教程(系列一)
Oct 26 Javascript
js禁止页面复制功能禁用页面右键菜单示例代码
Aug 29 Javascript
js+csss实现的一个带复选框的下拉框
Sep 29 Javascript
node.js中的fs.chownSync方法使用说明
Dec 16 Javascript
BootStrap实现手机端轮播图左右滑动事件
Oct 13 Javascript
BootStrap实现鼠标悬停下拉列表功能
Feb 17 Javascript
浅谈Angular文字折叠展开组件的原理分析
Nov 24 Javascript
微信小程序实现签到功能
Oct 31 Javascript
javascript严格模式详解(含严格模式与非严格模式的区别)
Nov 12 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程序
2006/10/09 PHP
php 创建以UNIX时间戳命名的文件夹(示例代码)
2014/03/08 PHP
linux下实现定时执行php脚本
2015/02/13 PHP
javascript下查找父节点的简单方法
2007/08/13 Javascript
js 获取服务器控件值的代码
2010/03/05 Javascript
jquery validate使用攻略 第四步
2010/07/01 Javascript
JS中的THIS和WINDOW.EVENT.SRCELEMENT详解
2015/05/25 Javascript
深入理解JQuery循环绑定事件
2016/06/02 Javascript
js实现京东轮播图效果
2017/06/30 Javascript
详解js几个绕不开的事件兼容写法
2017/08/30 Javascript
JS判断数组那点事
2017/10/10 Javascript
Vue简单封装axios之解决post请求后端接收不到参数问题
2020/02/16 Javascript
vue select 获取value和lable操作
2020/08/28 Javascript
JavaScript检测是否开启了控制台(F12调试工具)
2020/10/02 Javascript
Python设计足球联赛赛程表程序的思路与简单实现示例
2016/06/28 Python
使用PyInstaller将Python程序文件转换为可执行程序文件
2016/07/08 Python
python之文件的读写和文件目录以及文件夹的操作实现代码
2016/08/28 Python
Python做简单的字符串匹配详解
2017/03/21 Python
NumPy.npy与pandas DataFrame的实例讲解
2018/07/09 Python
Python 运行 shell 获取输出结果的实例
2019/01/07 Python
Python 多个图同时在不同窗口显示的实现方法
2019/07/07 Python
Django 反向生成url实例详解
2019/07/30 Python
Python django框架输入汉字,数字,字符生成二维码实现详解
2019/09/24 Python
Python批量处理csv并保存过程解析
2020/05/16 Python
Python-for循环的内部机制
2020/06/12 Python
一文带你掌握Pyecharts地理数据可视化的方法
2021/02/06 Python
html5 canvas移动浏览器上实现图片压缩上传
2016/03/11 HTML / CSS
Clos19英国:高档香槟、葡萄酒和烈酒在线购物平台
2020/07/10 全球购物
Java TransactionAPI (JTA) 主要包含几部分
2012/12/07 面试题
英语专业推荐信
2013/11/16 职场文书
法人授权委托书范本
2014/09/17 职场文书
缓刑人员思想汇报
2014/10/11 职场文书
党的群众路线批评与自我批评范文
2014/10/16 职场文书
2014年体检中心工作总结
2014/12/23 职场文书
2015年大学班级工作总结
2015/04/28 职场文书
vue实现列表拖拽排序的示例代码
2022/04/08 Vue.js