$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上的内容

var initWatch = function () {
var closeWatchMethod = $scope.$watch('currentChargeType', function (newValue, oldValue) {
if (!newValue) return;
$scope.currentChargeApplyType = chargeBaseToolUtil.upperWordFirst(newValue) + 'Charge';
initComboBox();
closeWatchMethod();
});
};

2、$observe

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

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. Django权限系统auth

    auth模块是Django提供的标准权限管理系统,可以提供用户身份认证, 用户组和权限管理. auth可以和admin模块配合使用, 快速建立网站的管理系统. 在INSTALLED_APPS中添加'd ...

  2. ubuntu如何实现双屏显示

    转载自https://blog.csdn.net/tianmaxingkong_/article/details/50570538

  3. How to Disable/Enable IP forwarding in Linux

    This article describes how to Disable or Enable an IP forwarding in Linux. Current IP forwarding sta ...

  4. JSR 规范目录

    JSR 规范目录 一.Servlet 规范 1.1 Servlet 2.x 规范 1.2 Servlet 3.x 规范 - 注解和异步请求规范 每天用心记录一点点.内容也许不重要,但习惯很重要!

  5. abp项目中无法使用HttpContext.Current.Session[""]的问题

    web项目Global.asax.cs中加入如下代码 public override void Init() { this.PostAuthenticateRequest += (sender, e) ...

  6. sqlserver 添加服务器链接 跨服务器访问数据库

    转载地址1:https://www.cnblogs.com/wanshutao/p/4137994.html //创建服务器链接 转载地址2:https://www.cnblogs.com/xulel ...

  7. css字符串转换为类map对象及反转

    存储对象为啥是类map(即:{key:val,...}格式),因为Map对象的val为字符时,无法存储 '('.')' 左右括号,我也很无奈╮(╯▽╰)╭ 解析脚本: <!DOCTYPE htm ...

  8. 博客写作的Checklist

    Checklist 1.不要发明术语. 2.不要使用指代不清的代词.如:我,他. 3.不要使用错误的承前省. 4.不要使用口语. 5.给出结论之前,先交代背景. 6.站立会议报告中应有燃尽图. 7.燃 ...

  9. Linux下安装启动多个Mysql

    网上找了N多资料,没有一个可以顺利成功的,郁闷,可能是水平有限吧...!本人经过不断的研究.测试,完整实现Linux下启动两台MySQL,而且对mysql有了更深入的了解...废话不多说,走着! 步骤 ...

  10. 2019.01.22 uoj#14. 【UER #1】DZY Loves Graph(并查集)

    传送门 题意简述: 要求支持以下操作: 在a与b之间连一条长度为i的边(i是操作编号):删除当前图中边权最大的k条边:表示撤销第 i−1次操作,保证第1次,第i−1 次不是撤回操作. 要求在每次操作后 ...