AngularJS:如何摆脱“错误:已达到10$digest()迭代。正在中止!”

AngularJS:如何摆脱“错误:已达到10$digest()迭代。正在中止!”,angularjs,directive,plunker,Angularjs,Directive,Plunker,我在项目中遇到了这个错误 为了说明这一点,我在 实际上,当您在搜索框中输入任何内容时,有两个错误,一个是错误:达到了10$digest迭代次数。流产!还有另一个未捕获的错误:达到10美元摘要迭代次数。流产!而且他们似乎在一起 如何修复它?请参见此处接受的答案: 要解决您的问题,请从ms search页面的属性:filtered items=Batchs | searchBatch:searchString->filtered items=Batchs中删除筛选器。您不能像这样对筛选器使用双向绑定

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

为了说明这一点,我在

实际上,当您在搜索框中输入任何内容时,有两个错误,一个是错误:达到了10$digest迭代次数。流产!还有另一个未捕获的错误:达到10美元摘要迭代次数。流产!而且他们似乎在一起


如何修复它?

请参见此处接受的答案:


要解决您的问题,请从ms search页面的属性:filtered items=Batchs | searchBatch:searchString->filtered items=Batchs中删除筛选器。您不能像这样对筛选器使用双向绑定,因为您的筛选器每次都返回一个新数组,并且摘要循环不断进行。您可以通过将项目与筛选器分开发送,然后使用$watch监视searchString并动态创建$scope.filteredItems来解决此问题。请看这里:

可能有一种方法可以将filter和filterType一起发送为1,但我不知道怎么做

请阅读此答案以了解更多详细信息:
-

如果$scope变量具有嵌套依赖项,则会发生此错误

每个作用域都运行一个摘要周期,在此周期中,Angular更新该作用域上的值的所有更改。例如,如果您的作用域上有一些值,并且您对其进行了更改,即设置$scope.val=5;或者别的什么。实际值会更改,但Angular不会实际应用该更改,直到它在摘要过程中返回并注意到已发生更改,然后在视图html文件中或需要更新的其他位置更新该值。这就是他们有这个函数的原因,它基本上迫使Angular注意到您对$scope所做的任何更改

说了这么多,这就是为什么我认为你会犯错误。由于没有花太多时间查看plunker,我认为问题在于您使用了两个嵌套的searchBatch筛选器。在您的视图中,您的视图如下所示:

<ms-search-pager filtered-items="batches | searchBatch:searchString" skip-items="skipItems" show-items="showItems" search-string="searchString"></ms-search-pager>
这意味着,无论何时范围中的任何值发生更改,无论是在指令中还是在控制器中,它都将在其他位置自动更新。但是,您还在partial中执行数据ng change=skipItems=0,这将迫使skipItems在每次按下按键时都进行更改。这将在您的范围内导致$digest循环。但您也在使用相同的值来帮助您的searchBatch筛选器,这也会导致摘要

总之,长话短说,你手工做的工作太多了,Angular会帮你的。由于这些额外的工作,您有太多的相关$scope更改,这些更改创建了一个由$digest循环组成的无限递归循环。Angular有一个陷阱,如果它经历了10个递归$digest循环,它就会退出


那么,你如何修复它呢?嗯,你知道你的代码比我好,所以这真的取决于你。我不确定您的所有依赖项都属于何处,因此您必须遍历它,看看是什么导致了所有摘要调用。我的猜测是,您可以删除数据ng change=skipItems=0位,并将更多精力放在使用$scope查找更改上,而不是试图通过视图/指令来完成。我知道这没有多大帮助,但我希望通过解释这些原则,你会发现问题所在,并能够解决问题。抱歉。

删除过滤器会导致他的过滤器总是显示3个中的1到3个。。。我认为他不想那样。兰登是对的,那会使显示器不反映过滤器。这在普朗克的情况下非常有效。然而,我在实际项目中遇到了一个小问题。filtedItems最初不会被触发,因此它最初读取的是“0中的0到0”,而不是“15中的1到10”。这可能是因为我从数据库中获取实际数据,而不是在Plunker中硬编码。我试图添加手表的项目,但也无法使其工作。任何提示?如果您通过$http获取并更新scope属性,则需要调用$scope。$apply更新该属性后。。。这将触发指令中的$watch。
scope: {
        filteredItems: '=',
        skipItems: '=',
        showItems: '=',
        searchString: '='
}