浅谈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 相关文章推荐
再谈ie和firefox下的document.all属性
Oct 21 Javascript
javascript实现面向对象类的功能书写技巧
Mar 07 Javascript
js判断为空Null与字符串为空简写方法
Feb 24 Javascript
JavaScript调用ajax获取文本文件内容实现代码
Mar 28 Javascript
JavaScript框架(iframe)操作总结
Apr 16 Javascript
JS实现自动定时切换的简洁网页选项卡效果
Oct 13 Javascript
js中flexible.js实现淘宝弹性布局方案
Jun 23 Javascript
三个js循环的关键字示例(for与while)
Feb 16 Javascript
jQuery自制提示框tooltip改进版
Aug 01 Javascript
jQuery基于排序功能实现上移、下移的方法
Nov 26 Javascript
解决vue中修改了数据但视图无法更新的情况
Aug 27 Javascript
vue学习之Vue-Router用法实例分析
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教程 变量定义
2009/10/23 PHP
php microtime获取浮点的时间戳
2010/02/21 PHP
显示youtube视频缩略图和Vimeo视频缩略图代码分享
2014/02/13 PHP
ThinkPHP3.1基础知识快速入门
2014/06/19 PHP
PHP请求Socket接口测试实例
2016/08/12 PHP
PHP面向对象程序设计__tostring()和__invoke()用法分析
2019/06/12 PHP
php使用socket调用http和smtp协议实例小结
2019/07/26 PHP
JQuery设置文本框和密码框得到焦点时的样式
2013/08/30 Javascript
Javascript学习笔记之 对象篇(四) : for in 循环
2014/06/24 Javascript
关于jquery中动态增加select,事件无效的快速解决方法
2016/08/29 Javascript
Javascript计算二维数组重复值示例代码
2016/12/18 Javascript
微信小程序 出现错误:{"baseresponse":{"errcode":-80002,"errmsg":""}}解决办法
2017/02/23 Javascript
vue bus全局事件中心简单Demo详解
2018/02/26 Javascript
vue cli 3.0 使用全过程解析
2018/06/14 Javascript
Vue双向绑定实现原理与方法详解
2020/05/07 Javascript
vue 导航守卫和axios拦截器有哪些区别
2020/12/19 Vue.js
全面理解Python中self的用法
2016/06/04 Python
Python使用asyncio包处理并发详解
2017/09/09 Python
解决pandas read_csv 读取中文列标题文件报错的问题
2018/06/15 Python
Python运行不显示DOS窗口的解决方法
2018/10/22 Python
python扫描线填充算法详解
2020/02/19 Python
Anaconda3中的Jupyter notebook添加目录插件的实现
2020/05/18 Python
python爬虫把url链接编码成gbk2312格式过程解析
2020/06/08 Python
keras的三种模型实现与区别说明
2020/07/03 Python
matplotlib subplot绘制多个子图的方法示例
2020/07/28 Python
Python实现异步IO的示例
2020/11/05 Python
建筑学推荐信
2013/11/03 职场文书
白酒业务员岗位职责
2013/12/27 职场文书
单位成立周年感言
2014/01/26 职场文书
联谊活动策划书
2014/01/26 职场文书
前台文员职责范本
2014/03/07 职场文书
制药工程专业职业生涯规划范文
2014/03/10 职场文书
食品采购员岗位职责
2014/04/14 职场文书
咖啡厅商业计划书
2014/09/15 职场文书
医院领导班子四风问题对照检查材料
2014/10/26 职场文书