AngularJS中watch监听用法分析


Posted in Javascript onNovember 04, 2016

本文实例讲述了AngularJS中watch监听用法。分享给大家供大家参考,具体如下:

ANGULAR 监听使用:

当angular数据模型发生变化时,我们需要如果需要根据他的变化触发其他的事件。

$watch是一个scope函数,用于监听模型变化,当你的模型部分发生变化时它会通知你。

$watch(watchExpression, listener, objectEquality);

watchExpression 需要监控的表达式
listener 处理函数,函数参数如下  function(newValue,oldValue, scope)
objectEquality 是否深度监听,如果设置为true,它告诉Angular检查所监控的对象中每一个属性的变化. 如果你希望监控数组的个别元素或者对象的属性而不是一个普通的值, 那么你应该使用它

<!DOCTYPE html>
<html ng-app="app">
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<script src="assets/angular.min.js"></script>
<script src="assets/js/jquery.min.js"></script>
<script type="text/javascript">
var app=angular.module("app",[]);
app.controller('MainCtrl', function($scope) {
  $scope.name = "Angular";
  $scope.updated = -1;
  $scope.$watch('name', function(newValue, oldValue) {
   if (newValue === oldValue) { return; } // AKA first run
   $scope.updated++;
  });
  var i=0;
  $scope.getScope=function(){
   // console.info(this);
   var obj=$("#btnTest");
   i++;
   angular.element( obj).scope().name="hello" +i;
  }
 });
</script>
<body ng-controller="MainCtrl">
 <input ng-model="name" />
 Name updated: {{updated}} times.
 <button id="btnTest" ng-click="getScope()">获取scope</button>
</body>
</html>

此代码监控$scope的name值的变化,如果发生变化则触发监听。

监控对象:

<!DOCTYPE html>
<html ng-app="app">
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<script src="assets/angular.min.js"></script>
<script src="assets/js/jquery.min.js"></script>
<script type="text/javascript">
var app=angular.module("app",[]);
app.controller('MainCtrl', function($scope) {
 $scope.user = { name: "Fox" };
  $scope.updated = -1;
  var watch=$scope.$watch('user', function(newValue, oldValue) {
  if (newValue === oldValue) { return; }
  $scope.updated++;
  $scope.$broadcast('userUpdate', newValue.name);
  });
  //watch();
  var i=0;
  $scope.$on('userUpdate',function(d,data){
   console.info(data);
  })
  $scope.getScope=function(){
   // console.info(this);
   var obj=$("#btnTest");
   i++;
   angular.element( obj).scope().user.name="hello" +i;
  }
 });
</script>
<body ng-controller="MainCtrl">
 <input ng-model="user.name" />
 Name updated: {{updated}} times.
 <button id="btnTest" ng-click="getScope()">获取scope</button>
</body>
</html>

这里我们点击按钮会发现监控并不会触发,原因是我们监控了user对象,这个user对象没哟发生变化,只不过属性值发生了变化。

如果我们希望监控user对象属性发生变化,有两个做法。

1.使用深度监控。

方法如下:

<!DOCTYPE html>
<html ng-app="app">
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<script src="assets/angular.min.js"></script>
<script src="assets/js/jquery.min.js"></script>
<script type="text/javascript">
var app=angular.module("app",[]);
app.controller('MainCtrl', function($scope) {
 $scope.user = { name: "Fox" };
  $scope.updated = -1;
  var watch=$scope.$watch('user', function(newValue, oldValue) {
  if (newValue === oldValue) { return; }
  $scope.updated++;
  $scope.$broadcast('userUpdate', newValue.name);
  },true);
  //watch();
  var i=0;
  $scope.$on('userUpdate',function(d,data){
   console.info(data);
  })
  $scope.getScope=function(){
   // console.info(this);
   var obj=$("#btnTest");
   i++;
   angular.element( obj).scope().user.name="hello" +i;
  }
 });
</script>
<body ng-controller="MainCtrl">
 <input ng-model="user.name" />
 Name updated: {{updated}} times.
 <button id="btnTest" ng-click="getScope()">获取scope</button>
</body>
</html>

设置为深度监控,只要对象发生变化,那么监听就会触发。

2.直接写对象的属性值路径。

var watch=$scope.$watch('user.name', function(newValue, oldValue) {
//具体代码就不全部写了。

消除监听

系统中太多的监听会影响系统的性能,我们可以在满足某些条件后,去掉监听。

去掉监听方法如下:

var watch=$scope.$watch('user', function(newValue, oldValue) {
  if (newValue === oldValue) { return; }
  $scope.updated++;
  $scope.$broadcast('userUpdate', newValue.name);
  },true);
//去掉监听。
watch();

在系统中使用事件广播。

比如在监听时,我们对外广播一个事件,

在控制其中写监听的处理方法:

实例如下:

$scope.$broadcast('userUpdate', newValue.name);

监听代码:

$scope.$on('userUpdate',function(d,data){
 console.info(data);
})

这种做法最好使用在指令中,指令中广播事件,在控制器中实现监听。好处在于实现代码的重用。

希望本文所述对大家AngularJS程序设计有所帮助。

Javascript 相关文章推荐
JS使用for循环遍历Table的所有单元格内容
Aug 21 Javascript
45个JavaScript编程注意事项、技巧大全
Feb 11 Javascript
javascript数组去重方法汇总
Apr 23 Javascript
jquery插件pagination实现无刷新ajax分页
Sep 30 Javascript
jquery实现简单的表单验证
Nov 17 Javascript
javascript学习指南之回调问题
Apr 23 Javascript
jQuery控制文本框只能输入数字和字母及使用方法
May 26 Javascript
JS 实现导航菜单中的二级下拉菜单的几种方式
Oct 31 Javascript
详解react如何在组件中获取路由参数
Jun 15 Javascript
JS函数内部属性之arguments和this实例解析
Oct 07 Javascript
JS中的一些常用的函数式编程术语
Jun 15 Javascript
如何使用CSS3+JQuery实现悬浮墙式菜单
Jun 18 jQuery
AngularJS中的DOM操作用法分析
Nov 04 #Javascript
JS对大量数据进行多重过滤的方法
Nov 04 #Javascript
AngularJS模板加载用法详解
Nov 04 #Javascript
jQuery 遍历map()方法详解
Nov 04 #Javascript
Sortable.js拖拽排序使用方法解析
Nov 04 #Javascript
jQuery图片加载显示loading效果
Nov 04 #Javascript
JavaScript 深层克隆对象详解及实例
Nov 03 #Javascript
You might like
星际争霸 Starcraft 游戏介绍
2020/03/14 星际争霸
讲解WordPress开发中一些常用的debug技巧
2015/12/18 PHP
gearman管理工具GearmanManager的安装与php使用方法示例
2020/02/27 PHP
javascript中的关于类型转换的性能优化
2010/12/14 Javascript
疯狂Jquery第一天(Jquery学习笔记)
2012/05/11 Javascript
鼠标拖动实现DIV排序示例代码
2013/10/14 Javascript
JavaScript实现防止网页被嵌入Frame框架的代码分享
2014/12/29 Javascript
jQuery实现仿Alipay支付宝首页全屏焦点图切换特效
2015/05/04 Javascript
JavaScript对象数组排序函数及六个用法
2015/12/23 Javascript
微信小程序 保留小数(toFixed)详细介绍
2016/11/16 Javascript
js制作可以延时消失的菜单
2017/01/13 Javascript
assert()函数用法总结(推荐)
2017/01/25 Javascript
JavaScript正则表达式函数总结(常用)
2018/02/22 Javascript
Angular5升级RxJS到5.5.3报错:EmptyError: no elements in sequence的解决方法
2018/04/09 Javascript
详解Vue项目在其他电脑npm run dev运行报错的解决方法
2018/10/29 Javascript
微信小程序在ios下Echarts图表不能滑动的问题解决
2019/07/10 Javascript
Node.js使用MongoDB的ObjectId作为查询条件的方法
2019/09/10 Javascript
Vue的双向数据绑定实现原理解析
2020/02/17 Javascript
[01:00:14]DOTA2-DPC中国联赛 正赛 Ehome vs Elephant BO3 第二场 2月28日
2021/03/11 DOTA
python打开url并按指定块读取网页内容的方法
2015/04/29 Python
Python selenium实现微博自动登录的示例代码
2018/05/16 Python
python代码 输入数字使其反向输出的方法
2018/12/22 Python
python实现生成Word、docx文件的方法分析
2019/08/30 Python
Python二元赋值实用技巧解析
2019/10/25 Python
PyQt使用QPropertyAnimation开发简单动画
2020/04/02 Python
python interpolate插值实例
2020/07/06 Python
翻新二手苹果产品的网络领导者:Mac of all Trades
2017/12/19 全球购物
Yummie官方网站:塑身衣和衣柜必需品
2019/10/29 全球购物
调研座谈会发言材料
2014/08/23 职场文书
技术员岗位职责
2015/02/04 职场文书
读书笔记怎么写
2015/07/01 职场文书
领导新年致辞2016
2015/07/29 职场文书
队名及霸气口号大全
2015/12/25 职场文书
幼儿园教学反思范文
2016/03/02 职场文书
python开发的自动化运维工具ansible详解
2021/08/07 Python
如何优化vue打包文件过大
2022/04/13 Vue.js