讨论AngularJS的优点时,双向数据绑定经常被吹捧为Angular相比其他JS框架的主要优势。更深入地挖掘,文档表明这个过程是通过脏检查而不是通过事件驱动措施来完成的。起初,digest循环似乎是通过在周期间隔内在后台触发方法来完成的,在每个周期内检查所有的$watch。然而,进一步阅读后,似乎digest循环实际上是由rootScope.digest()触发的,而rootScope.digest()又由$.apply触发,$.apply又由事件(!)触发,例如通过ng-click调用的onClick事件。
但是,这怎么可能呢?我以为Angular 不使用变更监听器。那么digest循环真正的运行方式是什么呢?Angular是否会自动启动digest循环内部,还是由事件触发digest循环? 如果digest循环是自动运行的,它运行的频率是多少?
一些澄清点:
- 我不是在询问手动绑定更改时digest循环如何运行。在这种情况下,如果您想强制进行digest循环,可以通过调用
$.apply()
来实现 - 我也不是在询问用户事件触发时digest循环运行的频率。例如,如果ng-model在输入框上,当用户开始输入时,Angular将启动一个digest循环。令人困惑的是,为了知道用户正在输入,Angular不是在某个地方使用基于事件的onKeyUp吗?
- 我已经知道每个digest循环最多有10个周期的限制。我的问题与每秒运行的digest循环数量有关,而不是每个digest循环的周期数。
- 额外的问题:digest循环如何与JavaScript事件循环相关?JS事件循环是否定期在后台运行?digest循环是事件循环的同一事物,但只在“Angular上下文”中吗?这些是完全不同的概念吗?