你是不是也常在想AngularJS $apply, $digest, 和$evalAsync到底有什么差别?这个篇博客中我们将探讨一下这三个方法。
AngularJS之所以这么受欢迎,是因为它有很多的处理程序帮我们完成了绝大部分的求值运算。AngularJS让前端开发工作变的简单高效,通过指令我们可以创建html标签,还可以创建独立的模块,AngularJS确实是创建SAP的最好框架之一。
AngularJS的核心之一就是$digset循环,这是AngularJS检测和重新呈现model和view的变化的方法。在每一个$digset循环中,检测列表中的所有的检测对象都会被执行,重新计算绑定到视图的模型对象,然后又将重新渲染的视图呈现给用户。这个过程是影响AngularJS性能的主要部分。
但是很多时候,我们需要在AngularJS的上下文之外对模型进行操作,而这样的操作AngularJS是无法检测到的,也就是说它不能更新model并重新呈现视图。我们有三个方法能个完成这个工作$apply,$digset和$evalAsync,但是在我们不知其所以然的直接调用他们之前,我们需要了解一下为了解决问题我们到底需要影响多少个检测对象,影响多少层scope。
这里有多种方法可以让AngularJS执行计算,也就是让AngularJS开启一个新的$digset循环:
- $apply()
- $timeout()
- $digest()
- $evalAsync()
$apply()
$apply()会触发整个应用中的所有scope上的$digset循环。意思就是,每次我们调用$apply()都会在整个应用的生命周期中开启一个新的$digset循环。整个生命周期涉及3个主要任务:
Scope’s $apply() method transitions through the following stages:
- The expression is executed using the $eval() method.
- Any exceptions from the execution of the expression are forwarded to the $exceptionHandler service.
- The watch listeners are fired immediately after the expression was executed using the $digest() method.

