在讨论AngularJS的优点时,双向数据绑定经常被吹捧为Angular相对于其他JS框架的主要优点。 Digging deeper,文档表明这个过程是通过脏检查而不是通过事件驱动的措施完成的。首先,似乎摘要循环的工作原理是在后台以周期性间隔触发方法,在每个周期内检查所有$watch
es。然而,进一步阅读,似乎摘要循环实际上由rootScope.digest()
触发,而$.apply
又由ng-click
触发,而$.apply()
又由事件(!)触发,例如onClick通过{{1}}调用的事件。
但是,这怎么可能呢?我认为Angular doesn't use change listeners。那么摘要循环真的如何运作? Angular会在内部自动启动摘要循环,还是由事件触发的摘要循环?如果摘要循环自动运行,它的运行频率是多少?
一些澄清要点:
答案 0 :(得分:13)
角度摘要被触发 - 它们不会通过民意调查发生。
代码在代码完成后执行,angular触发摘要。
示例:
element.on('click', function() {
$scope.$apply(function() {
// do some code here, after this, $digest cycle will be triggered
});
});
Angular还会在编译/链接阶段后触发$摘要:
Compile > Link > Digest
关于触发了多少个摘要周期?这取决于范围变量稳定的时间。通常至少需要2个周期才能确定。
答案 1 :(得分:12)
对主要问题的简短直接回答是" NO",angular不会自动触发摘要循环。
TL; DR回答:
摘要循环旨在对与角度范围实例关联的POJO模型运行脏检查,因此只需在模型可能更改时运行。在浏览器中运行的单页Web应用程序中,以下操作/事件可能导致模型更改
相应地,Angular触发器摘要循环,例如
尝试从我的理解中回答这些奖励问题:
因此,避免角度性能陷阱的一些关键做法是
答案 2 :(得分:4)
我相信这就是发生的事情。 AngularJS巧妙地假设模型变化仅发生在用户交互上。这些相互作用可能由于
而发生相应事件的AngularJS指令将表达式执行包装在$ scope。$ apply中,如@pixelbits所示。这导致了消化循环。
还有一些其他事件,AngularJS触发摘要循环。 $ timeout服务和$ interval服务是两个这样的例子。包含在这些服务中的代码也会导致运行摘要循环。 可能有一些其他事件\服务可以导致执行摘要周期,但这些是主要的。
这就是Angular上下文之外的模型更改不会更新监视和绑定的原因。所以需要显式调用$ scope。$ apply。我们在与jQuery插件集成时一直这样做。