简介

首先apply方法会触发evel方法,当evel方法解析成功后,会去触发digest方法,digest方法会触发watch方法。

在digest执行时,如果watch观察的的value与上一次执行时不一样时,就会被触发。

AngularJS内部的watch实现了页面随model的及时更新。

$watch方法在用的时候主要是手动的监听一个对象,但对象发生变化时触发某个事件。】

语法

$watch(watchFn,watchAction,deepWatch)

watchFn:该参数是一个带有Angular 表达式或者函数的字符串,它会返回被监控的数据模型的当前值。这个表达式将会被执行很多次,所以你要保证它不会产生其他副作用。也就是说,要保证它可以被调用很多次而不会改变状态。基于同样的原因,监控表达式应该很容易被计算出来。如果你使用字符串传递了一个Angular 表达式,那么它将会针对调用它的那个作用域中的对象而执行。

     watchAction(newValue,oldValue,scope):这是一个函数或者表达式,当watchFn 发生变化时会被调用。如果是函数的形式,它将会接收到watchFn 的新旧两个值,以及作用域对象的引用。其函数签名为function(newValue, oldValue, scope)。

deepWatch:如果设置为true,这个可选的布尔型参数将会命令Angular 去检查被监控对象的每个属性是否发生了变化。如果你想要监控数组中的元素,或者对象上的所有属性,而不只是监控一个简单的值,你就可以使用这个参数。由于Angular 需要遍历数组或者对象,如果集合比较大,那么运算负担就会比较重。

    $watch会返回一个函数,想要注销这个watch可以使用函数.
  var dereg = $scope.$watch('someModel.someProperty', callbackOnChange());dereg();

用法 

    <h3>watch简单数据类型</h3><div ng-controller="ng-watch"><input type="text" ng-model="num"><br/><span ng-bind="'变化前的值-'+preVal"></span><br/><span ng-bind="'变化后的值-'+val"></span><br/><label ng-bind="'变化次数-'+count"></label></div>m1.controller("ng-watch",["$scope",function($sc){$sc.num = 0;$sc.count = 0;$sc.preVal = "";$sc.val = "";$sc.$watch("num",function(newValue,oldValue){if(newValue!==oldValue){$sc.preVal = oldValue;$sc.val = newValue;$sc.count++;}});}]);

    <h3>watch对象</h3><div ng-controller="ng-watch2"><input type="text" ng-model="o.num"><br/><span>{{'变化前的值-'+preObj}}</span><br/><span>{{'变化后的值-'+obj}}</span><br/><label ng-bind="'变化次数-'+count"></label></div>m1.controller("ng-watch2",["$scope",function($sc){$sc.o = {"num": 0};$sc.count = 0;$sc.preObj = "";$sc.obj = "";$sc.$watch('o',function(newValue,oldValue){if(newValue!==oldValue){$sc.preObj = oldValue;$sc.obj = newValue;$sc.count++;}},true);}]);

效果:http://runjs.cn/detail/vnlh0eny


转载于:https://www.cnblogs.com/zhx1991/p/4580868.html

AngularJS之watch相关推荐

  1. AngularJS和DataModel

    通常,在AngularJS中使用JSON作为存储数据的模型.我们可能这样在controller中写model: app.controller('BookController',['$scope',fu ...

  2. AngularJS 杂项知识点

    1.要用ngChange要同时使用ngModel,下拉选择获取当前选中值. 2.打包代替动态加载(js文件) requirejs真正的价值在于模块化,不是动态加载,angularjs本身有模块化机制, ...

  3. angularjs post 跨域

    web api搞好了:用Ajax妥妥的:但是前端用的AngulagJS,也懒得再换为Ajax了: 但是问题来了:提示: 已拦截跨源请求:同源策略禁止读取位于 http://x.x.x.x:port/a ...

  4. AngularJS 指令

    1. AngularJS指令的特点: AngularJS通过被称为指令的新属性来扩展HTML,指令的前缀为ng-. AngularJS通过内置的指令来为应用添加功能. AngularJS允许你自定义指 ...

  5. AngularJS中的按需加载ocLazyLoad

    欢迎大家讨论与指导 : ) 初学者,有不足的地方希望各位指出 一.前言 ocLoayLoad是AngularJS的模块按需加载器.一般在小型项目里,首次加载页面就下载好所有的资源没有什么大问题.但是当 ...

  6. 【12】AngularJS 事件

    AngularJS 事件 AngularJS 有自己的 HTML 事件指令. ng-click 指令 ng-click 指令定义了 AngularJS 点击事件. <div ng-app=&qu ...

  7. Angular的ChangeDetectorRef.detectChanges()实现angularJS的$apply()方法,强制刷新数据渲染

    在Javascript代码里,都是按照一定顺序来执行的,当轮到一个代码片段执行的时候,浏览器就只会去执行当前的片段,不会做任何其他的事情.所以有时候一些做得不是很好的网页,当点击了某个东西之后会卡住, ...

  8. AngularJS学习笔记(3)——通过Ajax获取JSON数据

    通过Ajax获取JSON数据 以我之前写的与用户交互的动态清单列表为例,使用JSON前todo.html代码如下: <!DOCTYPE html> <html ng-app=&quo ...

  9. angularjs 学习笔记 简单基础

    angularjs是谷歌公司的一个项目,弥补了hml在构建方面的不足,通过指令(directive)来扩展html标签,可以使开发者使用html来声明动态内容. angularjs主要用来开发单页应用 ...

  10. Angularjs集成第三方js插件之Uploadify

    有时候需要用一些第三方插件,比如datepicker,slider,或者tree等.以前的做法是直接通过jquery取得某个元素,然后调用某个方法即可.但在angularjs中,不能直接这么写,必须写 ...

最新文章

  1. 程序员崩溃的40多个瞬间!!!太形象了,你遇到过几个?
  2. 最全python面试题
  3. 13-19 Python Number、Python字符串、Python列表(List)、集合的基本操作、元组、字典Dicttionnary、日期和时间
  4. ORA-28056:Writing audit records to Windows Even...
  5. ASIHTTPRequest详解 [经典3]
  6. Spark SQL(三)之视图与执行SQL
  7. oracle的dtime,Oracle时间函数
  8. 计算机应用基础案例实训教程,计算机应用基础案例式实训教程
  9. 程序员经典面试题,高并发系统,一般需要怎么做
  10. java switch finally_JavaSE
  11. 授人以鱼不如授人以渔
  12. 设计一款知识性产品需要考虑十二个基本问题
  13. 牛人三个月内花不到 5000 美元拿到 CS 学位
  14. 比继承更有弹性的装饰者模式
  15. 抖音java表白教程_抖音vbs表白代码制作方法分享
  16. 那个只能在win7的扫雷游戏,你能通关吗?今天用Python教大家,上号!!!
  17. 心理学推荐书籍——《九型人格》
  18. IE浏览器被删除后添加失败的恢复指南
  19. windows11中windows安全中心打不开的解决办法
  20. (二)如何使用Progress Bar

热门文章

  1. @SentinelResource注解实现热点限流
  2. Spring中Bean的作用域都有哪些?
  3. 网络技巧:WiFi越用越慢,到底是什么原因,看完你就明白了!
  4. Java技术:项目构建工具Maven最佳替代者gradle介绍
  5. 计算机网络必备知识,非常全面!
  6. 计算机网络基础:网络标准相关知识介绍
  7. 收集很实用的 Linux 高级命令
  8. 提高程序员工作效率的11个技巧
  9. python语言的取余运算符_Python 中用于整数除法取余的运算符是()_学小易找答案...
  10. python爬虫面试遇到的问题