浅谈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 相关文章推荐
js资料prototype 属性
Mar 13 Javascript
javascript 限制输入脚本大全
Nov 03 Javascript
jquery插件制作 表单验证实现代码
Aug 17 Javascript
js获取php变量的实现代码
Aug 10 Javascript
Bootstrap精简教程
Nov 27 Javascript
15个值得开发人员关注的jQuery开发技巧和心得总结【经典收藏】
May 25 Javascript
简单理解Vue条件渲染
Dec 03 Javascript
jQuery插件imgAreaSelect基础讲解
May 26 jQuery
原JS实现banner图的常用功能
Jun 12 Javascript
angularJS1 url中携带参数的获取方法
Oct 09 Javascript
vue单页面在微信下只能分享落地页的解决方案
Apr 15 Javascript
js生成1到100的随机数最简单的实现方法
Feb 07 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
五款常用mysql slow log分析工具的比较分析
2011/05/22 PHP
php学习笔记之 函数声明
2011/06/09 PHP
简单谈谈php浮点数精确运算
2016/03/10 PHP
php格式化时间戳
2016/12/17 PHP
PHP判断是否微信访问的方法示例
2019/03/27 PHP
php学习笔记之字符串常见操作总结
2019/07/16 PHP
javascript中的delete使用详解
2013/04/11 Javascript
通过JS判断联网类型和连接状态的实现代码
2015/04/01 Javascript
基于jQuery实现复选框是否选中进行答题提示
2015/12/10 Javascript
jquery判断复选框选中状态以及区分attr和prop
2015/12/18 Javascript
第十篇BootStrap轮播插件使用详解
2016/06/21 Javascript
基于js对象,操作属性、方法详解
2016/08/11 Javascript
让浏览器崩溃的12行JS代码(DoS攻击分析及防御)
2016/10/10 Javascript
jquery ajaxfileupload异步上传插件使用详解
2017/02/08 Javascript
利用Plupload.js解决大文件上传问题, 带进度条和背景遮罩层
2017/03/15 Javascript
详解使用路由延迟加载 Angular 模块
2017/10/12 Javascript
layui给下拉框、按钮状态、时间赋初始值的方法
2019/09/10 Javascript
vue使用axios实现excel文件下载的功能
2020/07/16 Javascript
Python向MySQL批量插数据的实例讲解
2018/03/31 Python
Pipenv一键搭建python虚拟环境的方法
2018/05/22 Python
opencv-python 读取图像并转换颜色空间实例
2019/12/09 Python
Python print不能立即打印的解决方式
2020/02/19 Python
pyautogui自动化控制鼠标和键盘操作的步骤
2020/04/01 Python
opencv 查找连通区域 最大面积实例
2020/06/04 Python
django 将自带的数据库sqlite3改成mysql实例
2020/07/09 Python
python 深度学习中的4种激活函数
2020/09/18 Python
css3隔行变换色实现示例
2014/02/19 HTML / CSS
纽约和芝加哥当天送花:Ode à la Rose
2019/07/05 全球购物
俄罗斯三星品牌商店:GalaxyStore
2020/11/04 全球购物
奥巴马演讲稿
2014/01/08 职场文书
励志演讲稿800字
2014/08/21 职场文书
网吧管理制度范本
2015/08/05 职场文书
Nginx进程管理和重载原理详解
2021/04/22 Servers
Requests什么的通通爬不了的Python超强反爬虫方案!
2021/05/20 Python
使用Python通过企业微信应用给企业成员发消息
2022/04/18 Python
Python first-order-model实现让照片动起来
2022/06/25 Python