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 相关文章推荐
javascript 语法基础 想学习js的朋友可以看看
Dec 16 Javascript
JQUERY对单选框(radio)操作的小例子
Apr 25 Javascript
jquery防止重复执行动画避免页面混乱
Apr 22 Javascript
JavaScript动态创建link标签到head里的方法
Dec 22 Javascript
jquery解析json格式数据的方法(对象、字符串)
Nov 24 Javascript
jQuery监听文件上传实现进度条效果的方法
Oct 16 Javascript
JS简单判断字符在另一个字符串中出现次数的2种常用方法
Apr 20 Javascript
Vue.js学习笔记之修饰符详解
Jul 25 Javascript
highcharts 在angular中的使用示例代码
Sep 20 Javascript
jquery select插件异步实时搜索实例代码
Oct 20 jQuery
教你使用vue-cli快速构建的小说阅读器
May 13 Javascript
Vue按时间段查询数据组件使用详解
Aug 21 Javascript
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
PHPShop存在多个安全漏洞
2006/10/09 PHP
php基础知识:类与对象(1)
2006/12/13 PHP
谈谈新手如何学习PHP
2006/12/14 PHP
php统计时间和内存使用情况示例分享
2014/03/13 PHP
php实现分页功能的详细实例方法
2019/09/29 PHP
JavaScript字符串String和Array操作的有趣方法
2012/12/18 Javascript
javascript获取本机操作系统类型的方法
2015/08/13 Javascript
jQuery实现获取table表格第一列值的方法
2016/03/01 Javascript
JS实现星星评分功能实例代码(两种方法)
2016/06/09 Javascript
jQuery Select下拉框操作小结(推荐)
2016/07/22 Javascript
javascript实现根据函数名称字符串动态执行函数的方法示例
2016/12/28 Javascript
js实现带三角符的手风琴效果
2017/03/01 Javascript
JS实现隔行换色的表格排序
2017/03/27 Javascript
浅谈react 同构之样式直出
2017/11/07 Javascript
element-ui多文件上传的实现示例
2019/04/10 Javascript
vue中实现高德定位功能
2019/12/03 Javascript
Vue组件间数据传递的方式(3种)
2020/07/13 Javascript
vue项目中openlayers绘制行政区划
2020/12/24 Vue.js
对于Python的框架中一些会话程序的管理
2015/04/20 Python
详解CSS3中border-image的使用
2015/07/18 HTML / CSS
css3 仿写阿里云水纹效果的示例代码
2018/02/10 HTML / CSS
HTML5 和小程序实现拍照图片旋转、压缩和上传功能
2018/10/08 HTML / CSS
在线购买世界上最好的酒:BoozeBud
2018/06/07 全球购物
马德里竞技官方网上商店:Atletico Madrid Shop
2019/03/31 全球购物
华为慧通笔试题
2016/04/22 面试题
Java语言程序设计测试题选择题部分
2014/04/03 面试题
文言文形式的学生求职信
2013/12/03 职场文书
12岁生日演讲稿
2014/05/14 职场文书
公司授权委托书范文
2014/09/21 职场文书
戒毒悔改检讨书
2014/09/21 职场文书
单位法人授权委托书范本
2014/10/09 职场文书
寒假致家长的一封信
2015/10/10 职场文书
2016元旦晚会主持人开场白和结束语
2015/12/03 职场文书
python3 实现mysql数据库连接池的示例代码
2021/04/17 Python
如何使JavaScript休眠或等待
2021/04/27 Javascript
Python matplotlib绘制雷达图
2022/04/13 Python