全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

浅谈angularJS的$watch失效问题的解决方案

本文介绍了浅谈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();
  }
});

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# angular  # watch  # 失效  # angular $watch 一个变量的变化(实例讲解)  # Angular中的$watch、$watchGroup、$watchCollection  # Angular中使用$watch监听object属性值的变化(详解)  # 关于angular js_$watch监控属性和对象详解  # 浅谈Angular.js中使用$watch监听模型变化  # AngularJS中$apply方法和$watch方法用法总结  # AngularJS中watch监听用法分析  # AngularJS中的$watch()  # $digest()和$apply()区分  # 第三个  # 多个  # 返回值  # 的是  # 是在  # 第一个  # 是有  # 不需要  # 就好  # 两种  # 给自己  # 第二个  # 给大家  # 它可以  # 在后面  # 它在  # 这几个  # 设置为  # 浅谈  # 好啦 


相关文章: 山东云建站价格为何差异显著?  清除minerd进程的简单方法  公司网站建设制作费用,想建设一个属于自己的企业网站,该如何去做?  如何在阿里云香港服务器快速搭建网站?  西安专业网站制作公司有哪些,陕西省建行官方网站?  如何通过WDCP绑定主域名及创建子域名站点?  建站之星导航配置指南:自助建站与SEO优化全解析  网站制作模板下载什么软件,ppt模板免费下载网站?  如何快速生成可下载的建站源码工具?  网站制作知乎推荐,想做自己的网站用什么工具比较好?  网站制作大概多少钱一个,做一个平台网站大概多少钱?  在线ppt制作网站有哪些软件,如何把网页的内容做成ppt?  建站之星如何实现PC+手机+微信网站五合一建站?  建站之星在线版空间:自助建站+智能模板一键生成方案  网站制作企业,网站的banner和导航栏是指什么?  建站之星导航菜单设置与功能模块配置全攻略  怎么将XML数据可视化 D3.js加载XML  创业网站制作流程,创业网站可靠吗?  长沙做网站要多少钱,长沙国安网络怎么样?  可靠的网站设计制作软件,做网站设计需要什么样的电脑配置?  如何在景安云服务器上绑定域名并配置虚拟主机?  Python多线程使用规范_线程安全解析【教程】  黑客入侵网站服务器的常见手法有哪些?  建站之星后台管理系统如何操作?  建设网站制作价格,怎样建立自己的公司网站?  青岛网站建设如何选择本地服务器?  C++用Dijkstra(迪杰斯特拉)算法求最短路径  建站主机默认首页配置指南:核心功能与访问路径优化  如何通过山东自助建站平台快速注册域名?  广州网站设计制作一条龙,广州巨网网络科技有限公司是干什么的?  东莞专业制作网站的公司,东莞大学生网的网址是什么?  网站制作与设计教程,如何制作一个企业网站,建设网站的基本步骤有哪些?  如何在橙子建站上传落地页?操作指南详解  广州营销型建站服务商推荐:技术优势与SEO优化解析  网站制作中优化长尾关键字挖掘的技巧,建一个视频网站需要多少钱?  广东专业制作网站有哪些,广东省能源集团有限公司官网?  百度网页制作网站有哪些,谁能告诉我百度网站是怎么联系?  ,网站推广常用方法?  如何选择PHP开源工具快速搭建网站?  简历在线制作网站免费版,如何创建个人简历?  建站之星如何一键生成手机站?  全景视频制作网站有哪些,全景图怎么做成网页?  如何快速搭建二级域名独立网站?  建站主机选购指南与交易推荐:核心配置解析  C#如何在一个XML文件中查找并替换文本内容  建站之星CMS建站配置指南:模板选择与SEO优化技巧  建站主机是否等同于虚拟主机?  Swift中switch语句区间和元组模式匹配  大同网页,大同瑞慈医院官网?  定制建站价位费用解析与套餐推荐全攻略 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。