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

发布时间 - 2026-01-11 02:45:27    点击率:

本文介绍了浅谈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()区分  # 第三个  # 多个  # 返回值  # 的是  # 是在  # 第一个  # 是有  # 不需要  # 就好  # 两种  # 给自己  # 第二个  # 给大家  # 它可以  # 在后面  # 它在  # 这几个  # 设置为  # 浅谈  # 好啦 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel事件监听器怎么写_Laravel Event和Listener使用教程  今日头条微视频如何找选题 今日头条微视频找选题技巧【指南】  如何在阿里云购买域名并搭建网站?  SQL查询语句优化的实用方法总结  JavaScript模板引擎Template.js使用详解  如何登录建站主机?访问步骤全解析  nginx修改上传文件大小限制的方法  Laravel如何实现API版本控制_Laravel版本化API设计方案  如何为不同团队 ID 动态生成多个独立按钮  Laravel如何创建自定义Facades?(详细步骤)  微信推文制作网站有哪些,怎么做微信推文,急?  魔毅自助建站系统:模板定制与SEO优化一键生成指南  Android 常见的图片加载框架详细介绍  Laravel如何使用.env文件管理环境变量?(最佳实践)  Laravel Eloquent模型如何创建_Laravel ORM基础之Model创建与使用教程  Laravel如何安装Breeze扩展包_Laravel用户注册登录功能快速实现【流程】  Laravel如何实现RSS订阅源功能_Laravel动态生成网站XML格式订阅内容【教程】  深圳网站制作平台,深圳市做网站好的公司有哪些?  Edge浏览器如何截图和滚动截图_微软Edge网页捕获功能使用教程【技巧】  历史网站制作软件,华为如何找回被删除的网站?  如何挑选优质建站一级代理提升网站排名?  Laravel怎么生成二维码图片_Laravel集成Simple-QrCode扩展包与参数设置【实战】  jQuery 常见小例汇总  Android GridView 滑动条设置一直显示状态(推荐)  Laravel如何生成API文档?(Swagger/OpenAPI教程)  香港服务器网站生成指南:免费资源整合与高速稳定配置方案  Laravel如何使用Socialite实现第三方登录?(微信/GitHub示例)  Win11关机界面怎么改_Win11自定义关机画面设置【工具】  HTML5段落标签p和br怎么选_文本排版常用标签对比【解答】  如何用wdcp快速搭建高效网站?  大学网站设计制作软件有哪些,如何将网站制作成自己app?  Laravel如何使用Sanctum进行API认证?(SPA实战)  如何在建站主机中优化服务器配置?  Android自定义listview布局实现上拉加载下拉刷新功能  东莞市网站制作公司有哪些,东莞找工作用什么网站好?  如何在阿里云香港服务器快速搭建网站?  中国移动官方网站首页入口 中国移动官网网页登录  Laravel Blade组件怎么用_Laravel可复用视图组件的创建与使用  详解CentOS6.5 安装 MySQL5.1.71的方法  Laravel如何使用Gate和Policy进行授权?(权限控制)  如何将凡科建站内容保存为本地文件?  如何在 Python 中将列表项按字母顺序编号(a.、b.、c. …)  如何快速搭建高效香港服务器网站?  Laravel如何实现全文搜索功能?(Scout和Algolia示例)  jQuery中的100个技巧汇总  Laravel如何监控和管理失败的队列任务_Laravel失败任务处理与监控  Python3.6正式版新特性预览  安克发布新款氮化镓充电宝:体积缩小 30%,支持 200W 输出  阿里云网站搭建费用解析:服务器价格与建站成本优化指南  Laravel Livewire是什么_使用Laravel Livewire构建动态前端界面