Angular:手动脏检查/$apply/$digest和监控对象/$watch
声明:借鉴好多chm资料、视频、PDF总结如下:
一、$apply的引入
View
<div ng-app="">
<div ng-controller="firstController">
<input ng-model="date"/>
{{date}}
</div>
</div>
原生js函数,不能实现刷新(因为没有实现双向绑定(脏检查))
var firstController = function($scope) {
$scope.date = new Date().getSeconds();
setInterval(function() {
//并没有触发 脏检查
$scope.date = new Date().getSeconds();
}, 1000)
}
原生js函数,在变量改变外面加上$scope.apply(fun),手动实现脏检查,实现刷新
var firstController = function($scope) {
$scope.date = new Date().getSeconds();
setInterval(function() {
$scope.$apply(function() {
$scope.date = new Date().getSeconds();
//....会去触发脏检查
})
}, 1000)
}
Angular内置函数,默认已经实现脏检查,实现刷新
var firstController = function($scope, $interval) {
$scope.date = new Date().getSeconds();
$interval(function() {
$scope.date = new Date().getSeconds();
}, 1000)
}
原生js:setInterval(fun)<==>$interval(fun) 一直循环执行
原生js:setTimeout(fun)<==>$TimeOut(fun) 执行一次
gif图结果


解释
以`ng-开头的` `事件` `指令`和默认`内置的函数`最后`都会执行脏检查`。
`原声js`要实现如此功能,必须`在变量改变外面加上$scope.apply(fun)`,这样会将这个`apply内的变量复制出一份`,`新值和旧值(备份)对比`,实现双向绑定
二、$watch监听一个对象
$watch(watchExpression, [listener], [objectEquality]);
两个参数
<div ng-app="">
<div ng-controller="firstController">
<input type="text" value="" ng-model="name"/><br/>
注意:页面加载的时候执行一次,默认1:改变次数:{{count}}
<br/>
注意:当次数超过5,页面改变一次,count会+2,触发2次
</div>
</div>
var firstController = function($scope) {
$scope.name = '李可';
$scope.count = 0;
// 监听一个model 当一个model每次改变时 都会触发第2个函数
$scope.$watch('name', function(newValue, oldValue) {
$scope.count=$scope.count+1;//页面加载的时候执行一次
if ($scope.count > 5) {//当次数超过5,页面改变一次,count会+2,触发2次
$scope.name = '已经大于5次了';
}
});
}
gif图结果

问题:为什么触发2次呢?
估计要分析脏检查的源码了:原谅我处于菜鸟阶段
问了一些人

三个参数 第三个为true,表示对象内部的属性。
深深地监视
<div ng-app="">
<div ng-controller="firstController">
<input type="text" value="" ng-model="data.name"/>
<input type="text" value="" ng-model="data.age"/>
<input type="text" value="" ng-model="count2"/>
</div>
</div>
var firstController = function($scope) {
$scope.data = {
name: '李可',
age: 18
}
$scope.count2 = 0;
$scope.$watch('data', function() {
++$scope.count2;
if ($scope.count2 > 3) {
$scope.data.age = '换超过3了';
}
}, true)
}
++i先加后用(同一个表达式内用)
i++先用(同一个表达式内用)后加
var a=2;++a;var b=a*3;alert(b)//9 ++a;var b=a*3;是两表达式
var c=2;c++;var d=c*3;alert(d)//9 c++;var d=c*3;是两表达式
var e=2;f=e++;alert(f)//2 f=e++ 有++表达式和=表达式 相当f=e; e=e+1
var g=2;h=++g;alert(h)//3 h=++g; 有++表达式和=表达式 相当g=g+1; h=g;
var i=2;x=++i +1;alert(x)//4 x=++i +1; 有++表达式和+表达式 相当i=i+1; x=i;
var m=2;y=m++ +1;alert(y)//3 x=i++ +1; 有++表达式和+表达式 相当y=m; m=m+1
gif图结果

注意:页面加载1次,`加1`
到临界条件时,`加2`,`以后也加1`
延伸
有了上述方法:我们可以监控 对象、数组。为了少第三个参数,具体数组操作,angular又增加
$watchCollection(obj, listener);,$watchGroup(watchExpressions, listener);
Angular:手动脏检查/$apply/$digest和监控对象/$watch的更多相关文章
- Angular DirtyChecking(脏值检查) $watch, $apply, $digest
Dirty Checking (脏值检查) Digest cycle and $scope Digest cycle and $scope First and foremost, AngularJS ...
- 理解Angular中的$apply()以及$digest()
$apply()和$digest()在AngularJS中是两个核心概念,但是有时候它们又让人困惑.而为了了解AngularJS的工作方式,首先需要了解$apply()和$digest()是如何工作的 ...
- 深入理解Angular中的$Apply()以及$Digest()
$apply()和$digest()在AngularJS中是两个核心概念,但是有时候它们又让人困惑.而为了了解AngularJS的工作方式,首先需要了解$apply()和$digest()是如何工作的 ...
- --@angularjs--理解Angular中的$apply()以及$digest()
$apply() 和 $digest() 在 AngularJS 中是两个核心概念,但是有时候它们又让人困惑.而为了了解 AngularJS 的工作方式,首先需要了解 $apply() 和 $dige ...
- (网页)理解Angular中的$apply()以及$digest()
转自CSDN: 工作有问题上CSDN上转转. $apply()和$digest()在AngularJS中是两个核心概念,但是有时候它们又让人困惑.而为了了解AngularJS的工作方式,首先需要了解$ ...
- (转) 理解Angular中的$apply()以及$digest()
原文地址:http://blog.csdn.net/dm_vincent/article/details/38705099 $apply()和$digest()在AngularJS中是两个核心概念,但 ...
- angularjs脏检查
angularjs实现了双向绑定,与vue的defineProperty不同,它的原理在于它的脏检查机制,以下做了一些总结: angular.js介绍 AngularJs是mvvm框架,它的组件是vm ...
- Angular 学习笔记 :初识 $digest , $watch , $apply,浅析用法 。
传统的浏览器事件循环 :浏览器本身一直在等待事件,并作出响应.如果你点击一个button或者在input 中输入字符,我们在 JS 中 监听这些事件并设定了回调函数,那么这些事件被触发以后,回调函数就 ...
- Angular 手动解析表达式
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
随机推荐
- css3学习总结7--CSS3 2D转换
CSS3 转换 通过 CSS3 转换,我们能够对元素进行移动.缩放.转动.拉长或拉伸. 2D 转换 在本次,您将学到如下 2D 转换方法: 1. translate() 2. rotate() 3. ...
- 铺地毯(luogu 1003)
题目描述 为了准备一个独特的颁奖典礼,组织者在会场的一片矩形区域(可看做是平面直角坐标系的第一象限)铺上一些矩形地毯.一共有 n 张地毯,编号从 1 到n .现在将这些地毯按照编号从小到大的顺序平行于 ...
- 说说GET和POST方法的区别
完全来自博客园的一篇文章,GET和POST有什么区别?说的非常有道理,学习了. 错误理解 反驳 GET使用URL或Cookie传参.而POST将数据放在BODY中. GET和POST与数据如何传递没有 ...
- 利用TabWidget实现底部菜单
TabWidget类似于通话记录的界面,通过切换多个标签从而显示出多个不同内容,能够展示内容丰富的页面信息,而且彼此之间不会干扰,有利于展示.下面,通过一个例子来学习用法 首先用一个类来继承TabAc ...
- 昨天用的流量有点多60M
就是因为值班这里没有无线,然后自己又是受前几次的影响,没有收到微信,然后就看了热点,这是用的快的.
- linux shell的切换
查看系统可用shell种类:(一般是bash shell) ➜ ~ chsh -l /bin/sh /bin/bash /sbin/nologin /bin/dash /bin/zsh 修改当前的sh ...
- Android 4.0源码目录结构
转:http://blog.csdn.net/xiangjai/article/details/9012387 在学习Android的过程中,学习写应用还好,一开始不用管太多代码,直接调用函数就可以了 ...
- 更改Windows控制台默认缓冲区行数和宽度
Windows控制台窗口默认的显示行数很少, 以至于有时候要显示很多东西的时候, 总是导致前面的内容丢失. 很不爽. 于是GG了下, 在StackOverflow上找到了答案~~~ 设置方式: 1. ...
- 操作JNI函数以及复杂对象传递
转自:http://blog.csdn.net/qinjuning/article/details/7607214 在掌握了JNI函数的使用和相关类型的映射后,以及知晓何利用javah工具生成对应的j ...
- Office Word 2013发布带数学公式的博客
今日在自学冈萨雷斯的<数字图像处理>一书,想做笔记来记录,并分享一些MATLAB代码,又加上刚刚注册博客园的账户,便想着如何能够较为方便的来书写博客.本文主要涉及到的问题有: 如何用wor ...