当一个摘要循环发生时,我很困惑,是按照每50ms的定时器定期(称之为
here和暗示
here)或者在进入角度上下文的每个事件之后调用定时器(正如
here,
here和
here)?
事情的例子:
在我的模型中,我有一个名为myVar的变量,值为3。
在我的html中,我有{{myvar}}。
触发一个按钮点击的事件,并在控制器中引发一个处理程序,处理程序中的代码是:
$scope.myVar = 4; // some heavy actions takes place for 3 seconds... $scope.myVar = 5;
假设UI线程不被阻止,用户点击按钮后会看到什么?他会看到只有5还是他会看到4和3秒后5?
我认为
http://blog.bguiz.com/post/60397801810/digest-cycles-in-single-page-apps年的消化循环的描述就是这样
code that runs at an interval
是非常误导,说实话,当提到Angular时,我甚至会说错。引用Pawel Kozlowski,Mastering Web Application Development with AngularJS
AngularJS does not use any kind of polling mechanism to periodically check for model changes
为了证明没有轮询,如果你有一个模板
<p>{{state}}</p>
和控制器代码
$scope.state = 'Initial'; // Deliberately *not* using $timeout here $window.setTimeout(function() { $scope.state = 'Changed'; },1000);
as in this plunker,则显示给用户的字符串将保持为“初始”,从不更改为“已更改”。
如果您想知道为什么经常会看到$ apply的呼叫,但并不总是这样,那么可能是因为Angular所带来的各种指令(如ngClick或ngChange)将调用$应用自身,然后触发循环。对本地JS事件的事件监听器直接不会这样做,所以他们必须刻意调用$ apply来进行任何反映在模板中的更改。