什么时候调用$ digest循环?

时间:2014-05-04 18:33:37

标签: angularjs data-binding

当一个摘要周期发生时,我很困惑,它是否每50毫秒定时调用一个定时器(如here所示,暗示here)或是在每个事件后调用它进入角度上下文(如hereherehere)?

重要的例子:

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

$scope.myVar = 4;
// some heavy actions takes place for 3 seconds...
$scope.myVar = 5;

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

3 个答案:

答案 0 :(得分:25)

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

  

以间隔运行的代码

非常具有误导性,说实话,在提到Angular时,我甚至会说错。引用Pawel Kozlowski,Mastering Web Application Development with AngularJS

  

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

如果你有

的模板,要证明没有民意调查
<p>{{state}}</p>

的控制器代码
$scope.state = 'Initial';
// Deliberately *not* using $timeout here
$window.setTimeout(function() {
  $scope.state = 'Changed';
},1000);

as in this plunker,然后显示给用户的字符串将保持为Initial,永远不会更改为Changed

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

答案 1 :(得分: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

答案 2 :(得分:3)

从外部处理时(包括ajax)处理的任何AngularJS范围变量都需要$ apply()。

Prop是Javascript函数因此更新angularjs值需要setTimeout

$apply是一个angularjs函数,它返回promise并负责当前作用域,并在同一个摘要周期中运行。

因此无需$timeout函数来更新值。