声明:借鉴好多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的更多相关文章

  1. Angular DirtyChecking(脏值检查) $watch, $apply, $digest

    Dirty Checking (脏值检查) Digest cycle and $scope Digest cycle and $scope First and foremost, AngularJS ...

  2. 理解Angular中的$apply()以及$digest()

    $apply()和$digest()在AngularJS中是两个核心概念,但是有时候它们又让人困惑.而为了了解AngularJS的工作方式,首先需要了解$apply()和$digest()是如何工作的 ...

  3. 深入理解Angular中的$Apply()以及$Digest()

    $apply()和$digest()在AngularJS中是两个核心概念,但是有时候它们又让人困惑.而为了了解AngularJS的工作方式,首先需要了解$apply()和$digest()是如何工作的 ...

  4. --@angularjs--理解Angular中的$apply()以及$digest()

    $apply() 和 $digest() 在 AngularJS 中是两个核心概念,但是有时候它们又让人困惑.而为了了解 AngularJS 的工作方式,首先需要了解 $apply() 和 $dige ...

  5. (网页)理解Angular中的$apply()以及$digest()

    转自CSDN: 工作有问题上CSDN上转转. $apply()和$digest()在AngularJS中是两个核心概念,但是有时候它们又让人困惑.而为了了解AngularJS的工作方式,首先需要了解$ ...

  6. (转) 理解Angular中的$apply()以及$digest()

    原文地址:http://blog.csdn.net/dm_vincent/article/details/38705099 $apply()和$digest()在AngularJS中是两个核心概念,但 ...

  7. angularjs脏检查

    angularjs实现了双向绑定,与vue的defineProperty不同,它的原理在于它的脏检查机制,以下做了一些总结: angular.js介绍 AngularJs是mvvm框架,它的组件是vm ...

  8. Angular 学习笔记 :初识 $digest , $watch , $apply,浅析用法 。

    传统的浏览器事件循环 :浏览器本身一直在等待事件,并作出响应.如果你点击一个button或者在input 中输入字符,我们在 JS 中 监听这些事件并设定了回调函数,那么这些事件被触发以后,回调函数就 ...

  9. Angular 手动解析表达式

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

随机推荐

  1. [Android Pro] 监听WIFI 打开广播

    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/> <uses-perm ...

  2. vmware安装linux.iso

    安装方法 : .进入Fedora后,在虚拟机选项栏中选VM->install vmware tools 拷贝VMware Tools.tar.gz到指定文件夹,解压缩 进入超级终端:在-> ...

  3. Ubuntu进不去,显示error:unknown filesystem (最简单解决方案总结)

    error filesysterm:文件系统错误 grub rescue:是让你拯救grub,就是你的grub坏了,引导程序坏了 要安装盘?要重装?No…… 只要几行命令就ok了 是的,这是我昨天亲自 ...

  4. 大神的游戏(codevs 1353)

    题目描述 Description 在那遥远的机房,有一片神奇的格子.为了方便起见,我们编号为1~n.传说只要放入一些卡片,就能实现愿望.卡片一共有m种颜色,但是相邻的格子间不能放入相同颜色的卡片.只要 ...

  5. svn status 显示 ~xx

    “~” 版本控制下的项目与其它类型的项目重名

  6. .NET委托解析

    委托这个概念其实我们都很熟悉了,但是在使用的时候很多人还是无法去把控它,我们可以试想一下,在平时编码的时候,你是直接按照业务逻辑直接创建类,new出一个对象来进行操作的还是说有用到委托来更高效的完成一 ...

  7. 【小技巧】9针USB转串口简易连通性测试,附25针转9针

    Part 1 前言 最近用SecureCRT连接串口,因为是笔记本用的USB转串口,好多次出现安装驱动OK,连接上了,但是没有串口打印.无法进行控制的问题:所以不清楚是USB串口的驱动问题,还是转接用 ...

  8. Vim插件安装

    一.常用的插件 sudo apt-get install vim vim-scripts vim-docsudo apt-get install ctagssudo apt-get install v ...

  9. ASP.NET Web.Config 读写辅助类

    using System; using System.Configuration; using System.Web; using System.Web.Configuration; namespac ...

  10. PHP5.3 goto操作符介绍

    goto操作符是PHP5.+后新增功能,用来跳转到程序的另一位置:用法很简单:goto后面带上目标位置的标志,在目标位置上用目标名加冒号标记如下: <?php goto a; echo 'aaa ...