浅谈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 相关文章推荐
类之Prototype.js学习
Jun 13 Javascript
JavaScript类库D
Oct 24 Javascript
javascript实现数字验证码的简单实例
Feb 10 Javascript
JQuery 实现在同一页面锚点链接之间的平滑滚动
Oct 29 Javascript
JS调用Android、Ios原生控件
Jan 06 Javascript
Vue Transition实现类原生组件跳转过渡动画的示例
Aug 19 Javascript
JavaScript实现开关等效果
Sep 08 Javascript
详解vue-cli项目中用json-sever搭建mock服务器
Nov 02 Javascript
vue实现数字动态翻牌的效果(开箱即用)
Dec 08 Javascript
vue实现短信验证码登录功能(流程详解)
Dec 10 Javascript
js+canvas实现简单扫雷小游戏
Jan 22 Javascript
云服务器部署Node.js项目的方法步骤(小白系列)
Mar 23 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中实现记住密码下次自动登录的例子
2014/11/06 PHP
php生成shtml类用法实例
2014/12/09 PHP
php使用指定字符列表生成随机字符串的方法
2015/04/18 PHP
PHP通过API获取手机号码归属地
2015/05/28 PHP
CI框架实现框架前后端分离的方法详解
2016/12/30 PHP
Laravel 框架路由原理与路由访问实例分析
2020/04/14 PHP
MacOS下PHP7.1升级到PHP7.4.15的方法
2021/02/22 PHP
JS 分号引起的一段调试问题
2009/06/18 Javascript
JsDom 编程小结
2011/08/09 Javascript
javascript时间函数基础介绍
2013/03/28 Javascript
JavaScript学习笔记之JS函数
2015/01/22 Javascript
浅谈NodeJS中require路径问题
2015/05/07 NodeJs
移动端JQ插件hammer使用详解
2015/07/03 Javascript
高性能JavaScript循环语句和条件语句
2016/01/20 Javascript
jQuery实现删除li节点的方法
2016/12/06 Javascript
利用yarn代替npm管理前端项目模块依赖的方法详解
2017/09/04 Javascript
Vue中封装input组件的实例详解
2017/10/17 Javascript
Layui 动态禁止select下拉的例子
2019/09/03 Javascript
angular inputNumber指令输入框只能输入数字的实现
2019/12/03 Javascript
使用nodeJS中的fs模块对文件及目录进行读写,删除,追加,等操作详解
2020/02/06 NodeJs
Vue实现购物车实例代码两则
2020/05/30 Javascript
js实现简易点击切换显示或隐藏
2020/11/29 Javascript
python中mechanize库的简单使用示例
2014/01/10 Python
python使用matplotlib绘图时图例显示问题的解决
2017/04/27 Python
BP神经网络原理及Python实现代码
2018/12/18 Python
对python中不同模块(函数、类、变量)的调用详解
2019/07/16 Python
python requests抓取one推送文字和图片代码实例
2019/11/04 Python
Django实现从数据库中获取到的数据转换为dict
2020/03/27 Python
CSS3教程(5):网页背景图片
2009/04/02 HTML / CSS
HTML5 3D衣服摇摆动画特效
2016/03/17 HTML / CSS
西班牙网上书店:Casa del Libro
2016/11/01 全球购物
美国农场鲜花速递:The Bouqs
2018/07/13 全球购物
英国婴儿产品专家:Samuel Johnston
2020/04/20 全球购物
电子信息工程自荐信
2014/05/26 职场文书
学生个人总结范文
2015/02/15 职场文书
详解vue中v-for的key唯一性
2021/05/15 Vue.js