什么时候调用$ digest循环?

adl*_*adl 21 data-binding angularjs

我当消化周期正在发生的事情很迷茫,是一种基于每50ms定时器它定期调用(因为它说,在这里,并暗示在这里),或者是每一个进入的角度范围内(因为它说,事件发生后呼吁在这里,在这里这里)?

重要的例子:

在我的模型中,我有一个名为myVar3 的变量.在我的HTML中,我有{{myvar}}.触发按钮单击等事件并在控制器中引发处理程序,处理程序内的代码为:

$scope.myVar = 4;
// some heavy actions takes place for 3 seconds...
$scope.myVar = 5;
Run Code Online (Sandbox Code Playgroud)

假设未阻止UI线程,用户在单击按钮后会看到什么?他会看到5或者他会看到4和3秒后5吗?

Mic*_*mza 25

我认为在http://blog.bguiz.com/post/60397801810/digest-cycles-in-single-page-apps上的摘要周期的描述是

以一定间隔运行的代码

是非常误导,说实话,在提到Angular时,我甚至会说错.引用Pawel Kozlowski,使用AngularJS掌握Web应用程序开发

AngularJS不使用任何类型的轮询机制来定期检查模型更改

要证明没有民意调查,如果你有一个模板

<p>{{state}}</p>
Run Code Online (Sandbox Code Playgroud)

和控制器代码

$scope.state = 'Initial';
// Deliberately *not* using $timeout here
$window.setTimeout(function() {
  $scope.state = 'Changed';
},1000);
Run Code Online (Sandbox Code Playgroud)

就像在这个plunker中一样,显示给用户的字符串将保持为Initial并且永远不会改变为Changed.

如果你想知道为什么你经常看到调用$apply,但并非总是如此,这可能是因为Angular附带的各种指令,例如ngClickngChange将调用$apply自己,这将触发循环.原生JS事件的事件监听器不会直接执行此操作,因此他们必须故意调用$apply以在模板中反映任何更改.


use*_*687 11

当角度上下文中的任何一个出现时,摘要过程将被启动:

  • DOM事件(如ng-click等)
  • 带回调的Ajax($ http等)
  • 带回调的定时器($ timeout等)
  • 叫$ apply,$ digest
  • 等等

值得注意的是,正常的浏览器相关DOM事件(onclick等)和setTimeout不会触发摘要过程,因为它们在"Angular Context"之外工作.

我从以下方面学到了以上内容: Angularjs Digest Cycle  -  TechCBT

以上是从这里提供的非常深入的教程快速快照:https: //www.youtube.com/watch?v = SYuc1oSjhgY