AngularJS $observe $watch
$observe $watch都可以用来监听值的变化,但是他们有显著的区别。$observe是用来监视DOM属性值的变化,而 $watch监视scope属性值的变化。AngularJS中的监听,都知道的有$watch,还有一种监听是$observe,$watch主要监听的是$scope上的属性,而$observe监听的是directive中attrs上的属性。
attrs.$observe('attr1', ....)
scope.$watch(“model.property”...)
一、要点
1、$watch
$watch()
是angular
上scope
对象的一个方法。- 任何一个控制器中,但是不推荐在在
控制器
中使用$watch()
;因为这样使得测试
和维护
变得很困难。 - 任何一个指令中,可以在指令的
link
函数中使用,这是一种推荐的方式。 - 他不但可以监测
angular expression
的变化,还可以检测function(){}
函数的变化,监测angular expression
的时候会使用$parse
将angular 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的更多相关文章
- 【js类库AngularJs】web前端的mvc框架angularjs之hello world
AngularJS诞生于2009年,由Misko Hevery 等人创建,后为Google所收购.是一款优秀的前端JS框架,已经被用于Google的多款产品当中.AngularJS有着诸多特性,最为核 ...
- JS框架~Angularjs
无意中看到anytao的项目,工作台,使用了Angularjs框架,感觉在前端表现上用户体验比较好,于是就简单看了一下,原来使用很简单,或者说,人家把代码封装的很好,以至于开发人员调用时比较简单,呵呵 ...
- 转载:温故而知新 - AngularJS 1.x
原文: http://geek.csdn.net/news/detail/102405 温故而知新 - AngularJS 1.x
- [转][Angularjs]$http.post与$.post
本文转自:https://www.cnblogs.com/wolf-sun/p/6878868.html 摘要 在angularjs发送post请求的时候,确实很困惑,在传递json数据的时候,总会遇 ...
- 一篇入门AngularJS
目录 1.AngularJS 应用 2.AngularJS 指令 3.AngularJS 表达式 4.AngularJS 模型 5.AngularJS 控制器 6.AngularJS 作用域 7.An ...
- 玩转spring boot——结合jQuery和AngularJs
在上篇的基础上 准备工作: 修改pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi=&q ...
- 初探AngularJS
一.前言 早已听说AngularJS的大名,并在很久前也编写过些小demo,但是都没有系统学习过.由于,在下个版本项目中用到了AngularJS,so,那就一起再来研究研究呗. 说到,这个Angula ...
- 摆脱DOM操作,从TodoMVC看angularJS
取代jQuery? 我很久之前便听说了angularJS的大名,之前的leader也经常感叹angularJS的设计如何如何精妙,可叹一直没有机会深入了解,国庆长假因为没钱出游,倒是可以对他做一个了解 ...
- 指令<AngularJs>
对于指令,可以把它简单的理解成在特定DOM元素上运行的函数,指令可以扩展这个元素的功能. 首先来看个完整的参数示例再来详细的介绍各个参数的作用及用法: angular.module('myApp', ...
- ng1.3+表单验证<AngularJs>
前一篇文章说过,ng1.3+以后对于表单验证有了优化,它不再需要一个详细的表达式状态创建元素显示或隐藏. 例如:我们在ng1.3之前的版本都需要如下写法: <div class="er ...
随机推荐
- eclipse手动安装alibaba代码规范插件
如果你的开发环境无法访问外网,那么手动安装阿里巴巴的代码规范插件是一个不错的选择.另外,很多教程说该插件需要jdk1.8以上,我试了一下jdk1.7也是可以运行的,更低的版本就不知道了,貌似jdk1. ...
- HTML的报告
import HTMLTestRunner class HTMLReporter(object): def reporter(self,filename,reportername,reporterdi ...
- openssl编译安装-各种蛋疼
arm平台 ubuntu Linux xxxxxx 3.0.62 #2 PREEMPT Tue Apr 2 20:14:12 CST 2013 armv7l armv7l armv7l GNU/Li ...
- centos6中搭建tomcat
一.安装jdk [root@tomcat ~]# yum -y list java* Loaded plugins: fastestmirror, security Loading mirror sp ...
- BP神经网络的参数改进参考?
参考文献:黄巧巧. 基于BP神经网络的手写数字识别系统研究[D].华中师范大学,2009. 47-52 BP神经网络的缺陷:收敛速度慢和局部极小点的问题 使用的改进方案有 1. 学习速率(learn ...
- 取消IDEA中代码重复的检测
- centos7 虚拟机安装docker-ce-17.09
1.创建虚拟机使用iso镜像centos-x86_64-7.3.1611 2.安装centos选择桌面版 3.配置命令行环境,网卡(见博客另一篇文章) 4.安装container-selinux-2. ...
- php 超时设置笔记
php.ini default_socket_timeout=5 mysql.connect_timeout = 5 max_execution_time = 5 php-fpm pm = dynam ...
- java运行报错:nested exception is java.lang.NoSuchFieldError: INSTANCE,但使用@Test测试是好的
解决方法: 原因是,在tomcat里,同名不同版本的jar包,默认加载版本低的.我项目里有两个httpclient jar包.一个4.2.5 另一个是4.5.所以加载了4.2.5的,而我要用的是4. ...
- vue-cli项目中使用rem
1.安装px2rem插件 npm install px2rem-loader lib-flexible --save 2.在main.js中引入lib-flexible import 'lib-fle ...