为什么这段代码没有达到10周期$ digest循环限制?

时间:2014-03-15 17:04:49

标签: angularjs angularjs-scope

根据http://angular-tips.com/blog/2013/08/watch-how-the-apply-runs-a-digest/

  

这是脏检查。现在已经检查了所有$watch,还有其他问题要问:是否有任何$watch已更新?如果其中至少有一个已更改,则循环将再次触发,直到所有$watch报告没有更改。这是为了确保每个模型都是干净的。请记住,如果循环运行超过10次,它将抛出异常以防止无限循环。

根据我的理解,如果我把它放在我看来:

{{ date }}

这在我的控制器中

$interval(function () { 
    $scope.date = new Date(); 
}, 1)
应该发生的是:

  1. $ interval调用我的fn并触发$ digest循环;
  2. date的$观察者报告其值已更改;
  3. 没有更多的观众,但由于"脏"州,再次询问$ watchers;
  4. date的$观察者报告其价值再次发生变化(因为它每1ms更改一次)
  5. 依此类推,直到10个周期,然后错误
  6. 但事实并非如此。代码运行正常,视图一直在更新,不会引发任何错误。

    为什么?

1 个答案:

答案 0 :(得分:2)

你从未达到10个摘要周期的限制,因为每次$ interval运行时它都会开始一个新的周期。

查看标题为"与浏览器事件循环集成的部分"在Angular developer guide

在您的方案中,$ interval正在生成新的浏览器事件。该事件导致Angular的$apply()函数正在运行。此过程完成。然后在下一个时间间隔,生成一个新事件并重新开始该过程。

Angular's event loop