3

看看以下内容:

https://dl.dropbox.com/u/4571/musicopeTypescript/musicopeTypescript/index.html

当您在输入框中键入“a”时,您会收到10 $digest() iterations reached. Aborting!错误消息。

你有什么想法,为什么会这样?

编辑:这是产生问题的代码:

http://embed.plnkr.co/PTkvPc

编辑:看起来这是 Song.clone 的问题。如果我用 angular.copy 替换它,那么它可以工作。任何人都可以解释一下吗?

这是工作版本:

http://plnkr.co/edit/8Jk1pR?p=preview

4

2 回答 2

4

要了解为什么会发生这种情况,最好了解 Angular如何运行 runtime。基本上有观察者不断返回不同的值,所以它不断地通过 $digest 循环,然后阻止它无限循环。从他们的$digest() 文档中

处理当前范围及其子范围的所有观察者。因为观察者的侦听器可以更改模型,所以 $digest() 会不断调用观察者,直到没有更多的侦听器被触发。这意味着有可能进入无限循环。此函数将抛出“超出最大迭代限制”。如果迭代次数超过 10。

在不知道您的代码在做什么的情况下,很难给出具体的解决方案来说明为什么会发生这种情况,但这应该回答您关于何时引发此错误的问题。

于 2012-11-07T23:36:04.253 回答
4

您的过滤器是否以某种方式修改了原始数据?这是唯一看起来会导致无限消化循环的具体事情。

编辑:关于不同的克隆功能会导致不同的行为。

我怀疑一个正在做深度克隆,另一个没有,在一种情况下,AngularJS 正在检查对象是否相等,而您的过滤器每次都在创建新对象,从而导致了问题。

我建议分解其中的一些逻辑,并可能将其中的一些移动到控制器或其他过滤器中。缩小数组范围的过滤器应该只这样做,并且只返回对原始对象的引用。然后您可以编写其他过滤器来操作标签等。

也为阿爸+1。:P

于 2012-11-08T06:06:19.690 回答