【问题标题】:AngularJS: How to get rid of "Error: 10 $digest() iterations reached. Aborting!"AngularJS:如何摆脱“错误:达到 10 个 $digest() 迭代。中止!”
【发布时间】:2013-10-15 17:24:12
【问题描述】:

我在我的项目中遇到了这个错误。

为了说明这一点,我在http://plnkr.co/edit/LBXeqA5zL2dH5Zjlu6h1 创建了一个 Plunker。

实际上,当您在搜索框中输入任何内容时,会出现两个错误,一个是Error: 10 $digest() iterations reached. Aborting!,另一个是Uncaught Error: 10 $digest() iterations reached. Aborting!,它们似乎是一起出现的。

如何解决?

【问题讨论】:

    标签: angularjs directive plunker


    【解决方案1】:

    您不能像这样在过滤器上使用双向绑定,因为您的过滤器每次都会返回一个新数组,并且摘要循环会不断进行。您可以通过将您的项目与过滤器分开发送来解决此问题,然后使用$watch 来查看您的searchString 并动态创建$scope.filteredItems。见这里:

    http://plnkr.co/edit/xQR6zAYM9gB7siAXPqJs?p=preview

    可能有办法将filterfilterType一起发送为1,但我不知道该怎么做。

    并阅读此答案以获取更多详细信息: - Angular.js pass filter to directive bi-directional ('=') attribute

    【讨论】:

    • 这适用于 Plunker 案例。但是,我在实际项目中遇到了一个小问题。 filtedItems 最初不会被触发,因此它最初读取“0 到 0 的 0”而不是“1 到 15 的 1 到 10”。这可能是因为我从数据库中获取实际数据,而不是在 Plunker 中进行硬编码。我试图添加项目的手表,但也无法使其工作。有什么建议吗?
    • 如果您通过$http 获取并更新范围属性,则需要在更新该属性后调用$scope.$apply()...这应该会触发您指令中的$watch
    【解决方案2】:

    在此处查看接受的答案:Angular filter works but causes "10 $digest iterations reached"

    要解决您的问题,请从 ms-search-page 的属性中删除过滤器:filtered-items="batches | searchBatch:searchString" -> filtered-items="batches"

    【讨论】:

    • 移除过滤器会导致他的过滤器总是显示“1 到 3 of 3”...我认为他不想这样。
    • Langdon 说得对,这会使显示无法反映过滤器。
    【解决方案3】:

    当您对 $scope 变量具有嵌套依赖项时,会发生此错误。

    每个作用域都会经历一个“摘要循环”,在这个“消化循环”中,Angular 会更新该作用域上值的所有更改。例如,如果您的范围有一些价值并且您更改了它(即设置$scope.val = 5; 或其他东西)。实际值发生了变化,但 Angular 并没有实际“应用”该更改,直到它通过摘要传递回来并注意到更改已经发生,然后在您的视图(html 文件)或其他其他地方更新该值它需要。这就是他们拥有$scope.$apply() 函数的原因,它基本上迫使Angular 注意到您对$scope 所做的任何更改。

    说了这么多,这就是(我认为)您遇到错误的原因。没有花很多时间查看您的 plunker,我认为问题在于您使用了两个嵌套的 searchBatch 过滤器。您在视图中的<ms-search-pager> 如下所示:

    <ms-search-pager filtered-items="batches | searchBatch:searchString" skip-items="skipItems" show-items="showItems" search-string="searchString"></ms-search-pager>
    

    您的指令对您过滤的所有值都有双向绑定,如下所示:

    scope: {
            filteredItems: '=',
            skipItems: '=',
            showItems: '=',
            searchString: '='
    }
    

    这意味着只要你的作用域中的任何值发生变化,无论是在你的指令中还是在你的控制器中,它都会在另一个地方自动更新。但是,您还在您的部分中执行data-ng-change="skipItems=0",这将强制skipItems 在每次按下键时更改。这将导致您的示波器出现$digest 循环。但是您也使用相同的值来帮助您的searchBatch 过滤器,这也会导致摘要。

    总之,长话短说,您手动完成了太多 Angular 会为您完成的工作。由于这些额外的工作,您有太多相关的 $scope 更改,这些更改会创建$digest() 循环的无限递归循环。 Angular 有个问题,如果它经历了 10 个递归 $digest() 循环,它就会退出。

    那么,你如何解决它?好吧,你知道你的代码比我好,所以这真的取决于你。我不确定您的所有依赖项都落在哪里,因此您必须遍历它并查看导致所有摘要调用的原因。我的猜测是您可以删除data-ng-change="skipItems=0" 位并更多地关注使用您的$scope 来查找更改,而不是尝试通过您的视图/指令来执行此操作。我知道这没有多大帮助,但我希望通过解释这些原则,您会发现问题所在并能够解决问题。对不起。

    【讨论】:

      猜你喜欢
      • 2014-03-20
      • 2013-11-10
      • 2016-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-07
      • 2013-09-19
      • 2013-11-25
      相关资源
      最近更新 更多