浅谈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 相关文章推荐
在图片上显示左右箭头类似翻页的代码
Mar 04 Javascript
JavaScript的removeChild()函数用法详解
Dec 27 Javascript
Bootstrap源码解读模态弹出框(11)
Dec 28 Javascript
JavaScript中的 attribute 和 jQuery中的 attr 方法浅析
Jan 04 Javascript
Vue.js如何实现路由懒加载浅析
Aug 14 Javascript
详解Puppeteer 入门教程
May 09 Javascript
React组件内事件传参实现tab切换的示例代码
Jul 04 Javascript
javascript实现图片轮播代码
Jul 09 Javascript
Js逆向实现滑动验证码图片还原的示例代码
Mar 10 Javascript
一篇文章带你使用Typescript封装一个Vue组件(简单易懂)
Jun 05 Javascript
利用JavaScript为句子加标题的3种方法示例
Jan 05 Javascript
Vite和Vue CLI的优劣
Jan 30 Vue.js
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导出中文乱码及phpmyadmin导入中文乱码的解决方法
2010/06/11 PHP
域名和cookie问题(域名后缀)
2012/10/10 PHP
jQuery向下滚动即时加载内容实现的瀑布流效果
2016/01/07 PHP
PHP执行linux命令常用函数汇总
2016/02/02 PHP
PHP数据库操作Helper类完整实例
2016/05/11 PHP
Ajax和PHP正则表达式验证表单及验证码
2016/09/24 PHP
ThinkPHP框架结合Ajax实现用户名校验功能示例
2019/07/03 PHP
Javascript打印网页部分内容的脚本
2008/11/17 Javascript
使用jquery插件实现图片延迟加载技术详细说明
2011/03/12 Javascript
js调用webservice中的方法实现思路及代码
2013/02/25 Javascript
JS简单的轮播的图片滚动实例
2013/06/17 Javascript
用js设置下拉框为只读的小技巧
2014/04/10 Javascript
实例讲解JQuery中this和$(this)区别
2014/12/08 Javascript
解决jquery实现的radio重新选中的问题
2015/07/03 Javascript
整理Javascript事件响应学习笔记
2015/12/02 Javascript
探究JavaScript函数式编程的乐趣
2015/12/14 Javascript
jquery根据td给相同tr下其他td赋值的实现方法
2016/10/05 Javascript
js学习总结_基于数据类型检测的四种方式(必看)
2017/07/04 Javascript
AngularJs导出数据到Excel的示例代码
2017/08/11 Javascript
Nodejs 发布自己的npm包并制作成命令行工具的实例讲解
2018/05/15 NodeJs
Node.js+ELK日志规范的实现
2019/05/23 Javascript
vxe-table vue table 表格组件功能
2019/05/26 Javascript
Vue 实现v-for循环的时候更改 class的样式名称
2020/07/17 Javascript
python使用chardet判断字符串编码的方法
2015/03/13 Python
python遍历小写英文字母的方法
2019/01/02 Python
Python爬虫实战之12306抢票开源
2019/01/24 Python
Python使用MyQR制作专属动态彩色二维码功能
2019/06/04 Python
Python实现链表反转的方法分析【迭代法与递归法】
2020/02/22 Python
通过python 执行 nohup 不生效的解决
2020/04/16 Python
Python Django搭建网站流程图解
2020/06/13 Python
乡下人家教学反思
2014/02/01 职场文书
竞聘书怎么写,如何写?
2014/03/31 职场文书
党支部创先争优承诺书
2014/08/30 职场文书
机关干部作风建设剖析材料
2014/10/23 职场文书
收入证明申请书
2015/06/12 职场文书
vue 把二维或多维数组转一维数组
2022/04/24 Vue.js