调试$ rootScope:infdig

时间:2015-09-24 08:14:42

标签: angularjs

这是一个常见问题:

  

达到5 $ digest()次迭代。中止!
    观察者在最近5次迭代中被解雇:[]

文档(https://docs.angularjs.org/error/ $ rootScope / infdig)解释了如何避免这种情况。

然而,偶尔,你最终会遇到这种情况。对于比玩具应用更大的项目,找到无限消化循环的原因可能非常困难。

我正在寻找有关如何找出导致循环的代码位置的调试提示。

4 个答案:

答案 0 :(得分:7)

问题已在此处得到解答 - How to Troubleshoot Angular "10 $digest() iterations reached" Error

作为两个最佳答案的简历:

  1. 删除所有可疑HTML - 基本上从模板中删除所有html,并检查是否没有警告(https://stackoverflow.com/a/17129274/274500
  2. 通常在函数返回新对象时发生https://stackoverflow.com/a/17116322/274500
  3. 您始终可以在此处使用条件断点 https://github.com/angular/angular.js/blob/c3220325a0a95484724a03bedca24e1bbf05dc80/src/ng/rootScope.js#L815来检查异常堆栈跟踪。

答案 1 :(得分:2)

可能有多种原因。我遇到的一个常见原因是ng-repeat中的过滤器会返回一个新数组,以便在ng-repeat上运行。

请检查您的ng-repeat表达式,这些表达式具有正在修改数组的关联过滤器。

答案 2 :(得分:0)

对我来说,错误发生在更改网址的方法中:

  self.setURL = function(item) {
    var mainUrl = window.location.origin + '#/' + self.baseUrl;
    if (item) {
      mainUrl += item.testId;
    }
    $location.$$absUrl = mainUrl;
  };

导致$rootScope:infdig错误

因此,在调试时,检查当前控制器/指令

中更改你的ur,location,hrefs的内容

答案 3 :(得分:0)

对我来说,错误发生在更改网址的方法中:

> self.setURL = function(item) {
>    
> 
>//Ajax call followed by promise function
>      servicejsfile.somefunctiom(transferObj).then(responce){
>        

> var somethingTrue=responce.featureAvailable;
>if (somethingTrue) {
> dothis();
>}else
> $window.location = newlocation;
> };

这更改了我应用程序URL的最后一部分。 这导致了$ rootScope:infdig错误

因此,在调试时,我注释掉了这一部分,并且没有重复错误,并且对应用程序的要求也发生了变化。

我无法解决此问题,因此我们的要求保持不变,我可以更改位置。

此问题的发生是通过控制器功能内部的一些 Ajax调用而发生的,并且仅在IE中:对于FF,chrome和safari,它表现得很完美,因为这些浏览器的JavaScript引擎速度更快。