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 相关文章推荐
extjs 学习笔记(一) 一些基础知识
Oct 13 Javascript
JQuery Tab选项卡效果代码改进版
Apr 01 Javascript
js下判断 iframe 是否加载完成的完美方法
Oct 26 Javascript
js的onload事件及初始化按钮事件示例代码
Sep 25 Javascript
对于Form表单reset方法的新认识
Mar 05 Javascript
discuz表情的JS提取方法分析
Mar 22 Javascript
React中ES5与ES6写法的区别总结
Apr 21 Javascript
微信小程序之发送短信倒计时功能
Aug 30 Javascript
vue组件开发props验证的实现
Feb 12 Javascript
详解javascript对数组和json数组的操作
Apr 15 Javascript
Ant Design Pro 下实现文件下载的实现代码
Dec 03 Javascript
原型和原型链 prototype和proto的区别详情
Nov 02 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
DIY实用性框形天线
2021/03/02 无线电
PHP之短标签开启设置
2013/06/17 PHP
php中mkdir函数用法实例分析
2014/11/15 PHP
PHP程序中使用adodb连接不同数据库的代码实例
2015/12/19 PHP
浅谈Laravel队列实现原理解决问题记录
2017/08/19 PHP
JavaScript 撑出页面文字换行
2009/06/15 Javascript
jquery链式操作的正确使用方法
2014/01/06 Javascript
JavaScript两种跨域技术全面介绍
2014/04/16 Javascript
JavaScript错误处理
2015/02/03 Javascript
js实现汉字排序的方法
2015/07/23 Javascript
JavaScript实现网页加载进度条代码超简单
2015/09/21 Javascript
js正则表达式注册页面表单验证
2016/10/11 Javascript
ajax与json 获取数据并在前台使用简单实例
2017/01/19 Javascript
浅谈React前后端同构防止重复渲染
2018/01/05 Javascript
解决angular2 获取到的数据无法实时更新的问题
2018/08/31 Javascript
基于vue-draggable 实现三级拖动排序效果
2020/01/10 Javascript
JS代码检查工具ESLint介绍与使用方法
2020/02/04 Javascript
JavaScript实现栈结构Stack过程详解
2020/03/07 Javascript
Vue事件处理原理及过程详解
2020/03/11 Javascript
JS中间件设计模式的深入探讨与实例分析
2020/04/11 Javascript
[01:32]DOTA2上海特锦赛现场采访:最想COS的英雄
2016/03/25 DOTA
python中ConfigParse模块的用法
2014/09/29 Python
在Python 3中实现类型检查器的简单方法
2015/07/03 Python
使用pyecharts在jupyter notebook上绘图
2020/04/23 Python
使用PyInstaller将Pygame库编写的小游戏程序打包为exe文件及出现问题解决方法
2019/09/06 Python
Python3 pandas 操作列表实例详解
2019/09/23 Python
python matplotlib模块基本图形绘制方法小结【直线,曲线,直方图,饼图等】
2020/04/26 Python
Python字符串查找基本操作代码案例
2020/10/27 Python
pycharm + django跨域无提示的解决方法
2020/12/06 Python
使用HTML5 Canvas绘制圆角矩形及相关的一些应用举例
2016/03/22 HTML / CSS
JAVA程序员自荐书
2014/01/30 职场文书
个人社会实践自我鉴定
2014/03/24 职场文书
2014老师三严三实对照检查材料思想汇报
2014/09/18 职场文书
2014司机年终工作总结
2014/12/05 职场文书
2015年教师自我评价范文
2015/03/04 职场文书
小学数学教学反思范文
2016/02/16 职场文书