浅谈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 相关文章推荐
css把超出的部分显示为省略号的方法兼容火狐
Jul 23 Javascript
用js脚本控制asp.net下treeview的NodeCheck的实现代码
Mar 02 Javascript
新浪微博字数统计 textarea字数统计实现代码
Aug 28 Javascript
在浏览器窗口上添加遮罩层的方法
Nov 12 Javascript
javascript 密码框防止用户粘贴和复制的实现代码
Feb 17 Javascript
AngularJS基础 ng-hide 指令用法及示例代码
Aug 01 Javascript
微信小程序 Nginx环境配置详细介绍
Feb 14 Javascript
基于JS实现移动端向左滑动出现删除按钮功能
Feb 22 Javascript
vue拦截器Vue.http.interceptors.push使用详解
Apr 22 Javascript
jQuery实现的上传图片本地预览效果简单示例
Mar 29 jQuery
node.js 基于cheerio的爬虫工具的实现(需要登录权限的爬虫工具)
Apr 10 Javascript
JavaScript获取时区实现过程解析
Sep 24 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字符串截取问题
2006/11/28 PHP
centos 5.6 升级php到5.3的方法
2011/05/14 PHP
ThinkPHP中RBAC类的四种用法分析
2014/11/24 PHP
Yii2.0表关联查询实例分析
2016/07/18 PHP
php设计模式之原型模式分析【星际争霸游戏案例】
2020/03/23 PHP
Extjs EditorGridPanel中ComboBox列的显示问题
2011/07/04 Javascript
JS 各种网页尺寸判断实例方法
2013/04/18 Javascript
JS使用ajax从xml文件动态获取数据显示的方法
2015/03/24 Javascript
创建自己的jquery表格插件
2015/11/25 Javascript
BootstrapValidator实现注册校验和登录错误提示效果
2017/03/10 Javascript
bootstrap响应式表格实例详解
2017/05/15 Javascript
js数字滑动时钟的简单实现(示例讲解)
2017/08/14 Javascript
浅谈React高阶组件
2018/03/28 Javascript
js 数组详细操作方法及解析合集
2018/06/01 Javascript
Vue监听数据渲染DOM完以后执行某个函数详解
2018/09/11 Javascript
JS自定义右键菜单实现代码解析
2020/07/16 Javascript
全面解析JavaScript Module模式
2020/07/24 Javascript
python实现的简单猜数字游戏
2015/04/04 Python
django接入新浪微博OAuth的方法
2015/06/29 Python
Python图像灰度变换及图像数组操作
2016/01/27 Python
OpenCV+Python--RGB转HSI的实现
2019/11/27 Python
PyQt5高级界面控件之QTableWidget的具体使用方法
2020/02/23 Python
python 生成任意形状的凸包图代码
2020/04/16 Python
详解CSS3实现响应式手风琴效果
2020/06/10 HTML / CSS
JD Sports比利时官网:英国领先的运动鞋和运动服饰零售商
2018/10/10 全球购物
台湾屈臣氏网路商店:Watsons台湾
2020/12/29 全球购物
什么是Smart Navigation?
2016/07/03 面试题
高中校园广播稿
2014/01/11 职场文书
幼教简历自我评价
2014/01/28 职场文书
美国探亲签证邀请信
2014/02/05 职场文书
保安岗位职责
2014/02/21 职场文书
大队委竞选演讲稿
2014/04/28 职场文书
2015年学生会纪检部工作总结
2015/03/31 职场文书
电影建国大业观后感
2015/06/01 职场文书
90条交通安全宣传标语
2019/10/12 职场文书
利用 SQL Server 过滤索引提高查询语句的性能分析
2021/07/15 SQL Server