$watch

$watch主要是用来监听一个对象,在对象发生变化时触发某个事件。 
用法:

$scope.$watch(watchFn,watchAction, deepWatch)

接下来讲一下这几个参数:

参数 说明
watchFn angular表达式或函数的字符串
watchAction(newValue,oldValue,scope) watchFn发生变化会被调用
deepWatch 可选的布尔值命令检查被监控的对象的每个属性是否发生变化

注意:deepWatch为布尔值,true时可以用来监测对象,false一般是用来监测个别元素。watchFn一般是在html中的ng-model标签。 
举个例子:

<body ng-controller="MainCtrl">
<input ng-model="user.name" />
Name updated: {{updated}} times.
</body>
app.controller('MainCtrl', function($scope) {
$scope.user = { name: "Fox" }; $scope.updated = 0; $scope.$watch('user', function(newValue, oldValue) {
if (newValue === oldValue) { return; }
$scope.updated++;
}, true); //必须有true
});

$watch默认情况下是比较两个对象所引用的是否相同,当我们在监听$scope.user时,如果改变$scope.user.name时,对$scope.user的引用是不会改变的,此时检测不到值的变化。但是在$watch中加入第三个参数为true时,就能每次去比较对象的值而不是引用。

$watchGroup()和$watchCollection()

由于watch()深比较性能较差,angular还提供了$watchGroup([watchExp], listener)和$watchCollection(obj, listener) 方法来分别监听数组和对象。 
$watchGroup: 
其实是使用watch监听一组watchExp,所以watchGroup不支持深比较 
$watchCollection: 
比$watch进一步,但是基于性能考虑它只向内关注1层,对数组重新赋值,或是对数组元素进行新增、删除、修改时,回调会被调用,注意只要是修改就会调用,如果给数组赋的值和之前一样也会触发回调。如果某个数组元素内部的某个属性被更新时,回调不会被调用。 
看个例子:

<div ng-controller="ctrl">

    <!-- $watch -->
<div>
<input type="text" ng-model="value1"/>
</div>
<div ng-bind="w1"></div> <!-- $watchGroup -->
<div>
<input type="text" ng-model="value2"/>
<input type="text" ng-model="value3"/>
</div>
<div ng-bind="w2"></div> <!-- $watchCollection -->
<ul>
<li ng-repeat="v in arr" ng-bind="v"></li>
</ul>
<div ng-bind="w3"></div>
</div>
angular.module('myApp', [])
.controller("ctrl", ["$scope", "$timeout", function ($scope, $timeout) { // $watch
var watcher = $scope.$watch("value1", function (newVal, oldVal) {
$scope.w1 = "$watch--" + "new:" + newVal + ";" + "old:" + oldVal;
if (newVal == 'clear') {//设置一个注销监听的条件
watcher(); //注销监听
}
}); // $watchGroup
$scope.$watchGroup(["value2", "value3"], function (newVal, oldVal) {
//注意:newVal与oldVal都返回的是一个数组
$scope.w2 = "$watchGroup--" + "new:" + newVal + ";" + "old:" + oldVal;
}); // $watchCollection
$scope.arr = ['nick', 'ljy', 'ljj', 'zhw'];
$scope.$watchCollection('arr', function (newVal, oldVal) {
$scope.w3 = "$watchCollection--" + "new:" + newVal + ";" + "old:" + oldVal;
});
$timeout(function () {
$scope.arr = ['my', 'name', 'is', 'nick'];
}, 2000);
}]);

angular之$watch() $watchGroup()和$watchCollection()的更多相关文章

  1. angular之$watch、$watchGroup、$watchCollection

    1,原型:$watch: function(watchExp, listener, objectEquality, prettyPrintExpression){}: 2,参数:watchExp(必须 ...

  2. angularjs--$watch、$watchGroup、$watchCollection含义

    angularjs的$watch.$watchGroup.$watchCollection使用方式   如果想在controller里面随时监听一个值的变化那就用$watch <p>    ...

  3. angular1.x + ES6开发风格记录

    angular1.x和ES6开发风格 一.Module ES6有自己的模块机制,所以我们要通过使用ES6的模块机制来淡化ng的框架,使得各业务逻辑层的看不出框架的痕迹,具体的做法是: 把各功能模块的具 ...

  4. AngularJS 1.x 思维索引

    我们在这里不讨论Angular2和Angular4,因为其完全重写,其实已经不叫AngularJS了. AngularJS的缺陷: 性能问题:通过检查脏值进行数据更新,当数据不断增加时,检查的效率就不 ...

  5. $watch, $watchCollection, $watchGroup的使用

    官方文档 $watch简单使用 $watch是一个scope函数,用于监听模型变化,当你的模型部分发生变化时它会通知你. $watch(watchExpression, listener, objec ...

  6. Angular.js中使用$watch监听模型变化

    $watch简单使用 $watch是一个scope函数,用于监听模型变化,当你的模型部分发生变化时它会通知你. $watch(watchExpression, listener, objectEqua ...

  7. angular源码分析:angular中$rootscope的实现——scope的一生

    在angular中,$scope是一个关键的服务,可以被注入到controller中,注入其他服务却只能是$rootscope.scope是一个概念,是一个类,而$rootscope和被注入到cont ...

  8. Angular:手动脏检查/$apply/$digest和监控对象/$watch

    声明:借鉴好多chm资料.视频.PDF总结如下: 一.$apply的引入 View <div ng-app=""> <div ng-controller=&quo ...

  9. Angular - - $rootScope.Scope

    这里讲的是一些scope的操作,如创建/注销/各种监听及scope间的通信等等. $rootScope.Scope 可以使用$injector通过$rootScope关键字检索的一个根作用域. 可以通 ...

随机推荐

  1. Linux下utf-8 BOM 的检查和删除 (65279错误解决办法)

    Java代码在转换为UTF-8编码后,Eclipse编译运行没有问题,但是用Maven编译时,抛出非法字符65278错误. 原因在于,转换后文件头部带有BOM信息,而Maven不支持,删掉文件头的BO ...

  2. BZOJ4321:queue2(DP)

    Description n 个沙茶,被编号 1~n.排完队之后,每个沙茶希望,自己的相邻的两人只要无一个人的编号和自己的编号相差为 1(+1 或-1)就行.现在想知道,存在多少方案满足沙茶们如此不苛刻 ...

  3. 【JavaScript】explode动画

    这是一个js实现的粒子聚合文字或图片的动画特效 部分程序如下 n.container = n.container[0] || n.container; /*有且仅有一个container*/ var ...

  4. logback将日志写入不同文件夹里

    转载:logback不同业务的日志打印到不同文件 一.logback.xml文件配置如下: <?xml version="1.0" encoding="UTF-8& ...

  5. Linux Notes | Linux常用命令行笔记

    [ show all running processes ] (1) ps -aux | less 'ps' means: Process Status The -a option tells ps ...

  6. 用画布canvas画安卓logo

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  7. android学习1:清晰详细android环境搭建,超简单

    废话少说,今天是Android学习的开篇的博客,接下来将把自己学习android的各种问题和经历总结一下,其实之前已经自己学过半年了,但是因为开始时刚学的移动端开发还没有概念,当时总结工作又做的不好, ...

  8. css 中的 initial inherit unset 意思

    写css时,在对属性进行选值,经常遇到unset , initial,inherit三个值.这几个值的含义. 1.inherit 可继承性 继承的意思. 每一个 CSS 属性都有一个特性就是,这个属性 ...

  9. yyy loves Maths VII(状压DP)

    题目背景 yyy对某些数字有着情有独钟的喜爱,他叫他们为幸运数字;然而他作死太多,所以把自己讨厌的数字成为"厄运数字" 题目描述 一群同学在和yyy玩一个游戏 每次,他们会给yyy ...

  10. linux 学习第十六天(Samba配置)

    Samba 服务 yum install samba mv smb.conf smb.conf.bak cat smb.conf.bak | grep -v "#" | grep ...