当您对 $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 来查找更改,而不是尝试通过您的视图/指令来执行此操作。我知道这没有多大帮助,但我希望通过解释这些原则,您会发现问题所在并能够解决问题。对不起。