浅谈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动态设置样式实现代码(2)
Jan 25 Javascript
jQuery中ajax的post()方法用法实例
Dec 26 Javascript
jquery插件star-rating.js实现星级评分特效
Apr 15 Javascript
jquery+ajax请求且带返回值的代码
Aug 12 Javascript
JSON遍历方式实例总结
Dec 07 Javascript
JavaScript中cookie工具函数封装的示例代码
Oct 11 Javascript
利用node.js制作命令行工具方法教程(一)
Jun 22 Javascript
Grunt针对静态文件的压缩,版本控制打包的实例讲解
Sep 29 Javascript
细说webpack源码之compile流程-rules参数处理技巧(1)
Dec 26 Javascript
Webpack实战加载SVG的方法
Dec 26 Javascript
vuex操作state对象的实例代码
Apr 25 Javascript
JavaScript与JQuery框架基础入门教程
Jul 15 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模拟HTTP认证
2006/10/09 PHP
PHP实现统计代码行数小工具
2019/09/19 PHP
Laravel Eloquent ORM 实现查询表中指定的字段
2019/10/17 PHP
用于自动添加Digg This!按钮的JavaScript
2006/12/23 Javascript
js 分栏效果实现代码
2009/08/29 Javascript
jquery键盘事件介绍
2011/01/31 Javascript
用js来定义浏览器中一个左右浮动元素相对于页面主体宽度的位置的函数
2012/01/21 Javascript
js优化针对IE6.0起作用(详细整理)
2012/12/25 Javascript
JavaScript常用全局属性与方法记录积累
2013/07/03 Javascript
通过JQuery实现win8一样酷炫的动态磁贴效果(示例代码)
2013/07/13 Javascript
jquery操作 iframe的方法
2014/12/03 Javascript
jQuery EasyUI datagrid实现本地分页的方法
2015/02/13 Javascript
小议JavaScript中Generator和Iterator的使用
2015/07/29 Javascript
学习使用AngularJS文件上传控件
2016/02/16 Javascript
AngularJS 自定义指令详解及示例代码
2016/08/17 Javascript
Angular 应用技巧总结
2016/09/14 Javascript
jquery实现静态搜索功能(可输入搜索文字)
2017/03/28 jQuery
JavaScript学习笔记之函数记忆
2017/09/06 Javascript
vue.js-div滚动条隐藏但有滚动效果的实现方法
2018/03/03 Javascript
@angular前端项目代码优化之构建Api Tree的方法
2018/12/24 Javascript
layui select 禁止点击的实现方法
2019/09/05 Javascript
基于vue.js仿淘宝收货地址并设置默认地址的案例分析
2020/08/20 Javascript
[02:40]DOTA2超级联赛专访430 从小就爱玩对抗性游戏
2013/06/18 DOTA
[01:30]2016国际邀请赛中国区预选赛神秘商店火爆开启
2016/06/26 DOTA
python 实现对文件夹内的文件排序编号
2018/04/12 Python
基于python实现获取网页图片过程解析
2020/05/11 Python
python利用proxybroker构建爬虫免费IP代理池的实现
2021/02/21 Python
使用html5新特性轻松监听任何App自带返回键的示例
2018/03/13 HTML / CSS
美国殿堂级滑板、冲浪、滑雪服装品牌:Volcom(钻石)
2017/04/20 全球购物
男女时尚与复古风格在线购物:RoseGal(全球免费送货)
2017/07/19 全球购物
介绍一下常见的木马种类
2014/11/15 面试题
优秀员工评语
2014/02/10 职场文书
个人维稳承诺书
2015/05/04 职场文书
python 统计代码耗时的几种方法分享
2021/04/02 Python
go语言求任意类型切片的长度操作
2021/04/26 Golang
把77A收信机改造成收音机
2022/04/05 无线电