$observe $watch都可以用来监听值的变化,但是他们有显著的区别。$observe是用来监视DOM属性值的变化,而 $watch监视scope属性值的变化。AngularJS中的监听,都知道的有$watch,还有一种监听是$observe,$watch主要监听的是$scope上的属性,而$observe监听的是directive中attrs上的属性。

  attrs.$observe('attr1', ....)

  scope.$watch(“model.property”...)

一、要点

 1、$watch

  • $watch()angularscope对象的一个方法。
  • 任何一个控制器中,但是不推荐在在控制器中使用$watch();因为这样使得测试维护变得很困难。
  • 任何一个指令中,可以在指令的link函数中使用,这是一种推荐的方式。
  • 他不但可以监测angular expression的变化,还可以检测function(){}函数的变化,监测angular expression的时候会使用$parseangular expression解析为一个函数,这个函数会在angular的每个脏值检查循环中被调用。

 2、$observe

  • $observe()angular指令中link函数中实例属性即(iAttr)的一个方法。
  • 只可以在指令中使用,也是在指令的link函数中使用。
  • 它只能够监测angular expression的变化,监测的方式和上面$watch()监测angular expression的方式一样。

二、区别

  $observe是属性对象上的方法,因此它是用来监控DOM属性上的值的变化,它仅用在指令内部,当你需要在指令内部监控包含有插值表达式({{}})的DOM属性的时候,就要用到这个方法,比如,

  attr1="Name:{{name}}",

  然后在指令里面:attrs.$observe('attr1', ....),

  但是假如你只用scope.$watch(attrs.attr1,...),这种情况下是无效的,因为{{}}无法被解析,所以你得到的是undefined, 在其他情况下用$watch。

1、指令(不使用隔离的作用域)

  在不使用隔离的作用域的指令中,$watch()只能够监测不带有插值标记({{}})的angular expression,比如在<div attr1='expr' attr2='{{expr}}'></div>中,只可以监测attr1='expr'中的attr1,监测attr2只能够得到一个undefined,因为存在{{}}插值符号。

  在不使用隔离的作用域的指令中,$observe()只能够监测带有插值标记的angular expression,比如在<div attr1='expr' attr2='{{expr}}'></div>中,只可以监测attr2='{{expr}}'中的attr2,监测attr1只会得到一个一成不变的字符串expr

2、指令(使用隔离的作用域)

  在使用隔离的作用域的指令中$watch()也可以监测带有插值标记({{}})的angular expression;因为使用了@或者=前缀标识符,它们已经帮我们实现了插值,所以可以这样使用。

三、例子

1、$watch

    currentChargeType为$scope上的内容

  1. var initWatch = function () {
  2. var closeWatchMethod = $scope.$watch('currentChargeType', function (newValue, oldValue) {
  3. if (!newValue) return;
  4. $scope.currentChargeApplyType = chargeBaseToolUtil.upperWordFirst(newValue) + 'Charge';
  5. initComboBox();
  6. closeWatchMethod();
  7. });
  8. };

2、$observe

  1. attrs.$observe('popShow', function (val) {
  2. $timeout(function () {
  3. var event = (val && (val == 'true' || val == true)) ? 'show' : 'hide';
  4. element.popover(event);
  5. });
  6. });

AngularJS $observe $watch的更多相关文章

  1. 【js类库AngularJs】web前端的mvc框架angularjs之hello world

    AngularJS诞生于2009年,由Misko Hevery 等人创建,后为Google所收购.是一款优秀的前端JS框架,已经被用于Google的多款产品当中.AngularJS有着诸多特性,最为核 ...

  2. JS框架~Angularjs

    无意中看到anytao的项目,工作台,使用了Angularjs框架,感觉在前端表现上用户体验比较好,于是就简单看了一下,原来使用很简单,或者说,人家把代码封装的很好,以至于开发人员调用时比较简单,呵呵 ...

  3. 转载:温故而知新 - AngularJS 1.x

    原文: http://geek.csdn.net/news/detail/102405 温故而知新 - AngularJS 1.x

  4. [转][Angularjs]$http.post与$.post

    本文转自:https://www.cnblogs.com/wolf-sun/p/6878868.html 摘要 在angularjs发送post请求的时候,确实很困惑,在传递json数据的时候,总会遇 ...

  5. 一篇入门AngularJS

    目录 1.AngularJS 应用 2.AngularJS 指令 3.AngularJS 表达式 4.AngularJS 模型 5.AngularJS 控制器 6.AngularJS 作用域 7.An ...

  6. 玩转spring boot——结合jQuery和AngularJs

    在上篇的基础上 准备工作: 修改pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi=&q ...

  7. 初探AngularJS

    一.前言 早已听说AngularJS的大名,并在很久前也编写过些小demo,但是都没有系统学习过.由于,在下个版本项目中用到了AngularJS,so,那就一起再来研究研究呗. 说到,这个Angula ...

  8. 摆脱DOM操作,从TodoMVC看angularJS

    取代jQuery? 我很久之前便听说了angularJS的大名,之前的leader也经常感叹angularJS的设计如何如何精妙,可叹一直没有机会深入了解,国庆长假因为没钱出游,倒是可以对他做一个了解 ...

  9. 指令<AngularJs>

    对于指令,可以把它简单的理解成在特定DOM元素上运行的函数,指令可以扩展这个元素的功能. 首先来看个完整的参数示例再来详细的介绍各个参数的作用及用法: angular.module('myApp', ...

  10. ng1.3+表单验证<AngularJs>

    前一篇文章说过,ng1.3+以后对于表单验证有了优化,它不再需要一个详细的表达式状态创建元素显示或隐藏. 例如:我们在ng1.3之前的版本都需要如下写法: <div class="er ...

随机推荐

  1. RabbitMQ 的基本介绍

    RabbitMQ官网教程:http://www.rabbitmq.com/getstarted.html RabbitMQ 是一个由 Erlang 语言开发的 AMQP 的开源实现.AMQP :Adv ...

  2. Java.WeakReference-SoftReference-PhantomReference

    Weak Reference, Soft Reference, Phantom Reference 1. Introduction "Weak reference objects, whic ...

  3. “Interrupted by header callback: Server reports Content-Length”如何解决

    mock初始化时的错误信息如下: Downloading Packages: [SKIPPED] systemd--.fc25.x86_64.rpm: Already downloaded [SKIP ...

  4. http协议(一)一些基础知识

    当我们在浏览器的地址栏中输入网址,然后点击回车,接着,浏览器就会呈现出我们需要的web界面,那么,这个界面是怎么产生的? web的界面是根据我们输入的URL(网址.地址),浏览器从服务器端获取对应的文 ...

  5. 码代码的小女孩(来自noip贴吧)

    天冷极了,下着雪,又快黑了.这是NOIP的前夜.在这又冷又黑的晚上,一个衣衫破烂的小女孩在机房敲着代码.她从班里逃出来的时候还拿着一本算导,但是有什么用呢?那是一本很破旧的书--那么大,一向是她妈妈垫 ...

  6. oracle迁移

    #导出scott的数据,排除 table_a table_b expdp system/password schemas=scott directory=datadir dumpfile=scott_ ...

  7. 使用UIkit的uk-form-icon后input框无法输入的问题

    相关版本UIkit2.27.5 uikit.min.css默认使用uk-form-icon的属性pointer-events: none:因此表框无法点击. <style type=text/c ...

  8. kbmmw 中XML 操作入门

    delphi 很早以前就自带了xml 的操作,最新版里面有三种XML 解释器,一种是MSXML,看名字就知道 这个是微软自带的,这个据delphi 官方称是速度是最快的,但是只能在windows 上使 ...

  9. 2019.01.23 ural1519 Formula 1(轮廓线dp)

    传送门 轮廓线dpdpdp模板题. 题意简述:给一个放有障碍的网格图,问有多少种方法能使所有非障碍格子都在同一条哈密顿回路上面. 考虑用括号序列的写法来状压这个轮廓线. 用000表示没有插头,111表 ...

  10. 2018.10.30 NOIP模拟 排列树(树形dp+组合数学)

    传送门 考试的时候乱搞过了. 其实题目就是让你求拓扑排序方案数. 直接树形dpdpdp然后组合数转移一下就行了. 乱搞代码