数组过滤器导致无限$ digest循环

时间:2015-03-17 18:02:28

标签: javascript angularjs angularjs-ng-repeat

我有两个对象集合。其中一个具有原始值的对象,另一个具有对象值。

我需要在动态列的html表中呈现集合。我已经为此做了一个过滤器,但是它可以用于原始对象值的收集,并导致无限的$ digest循环(参见控制台)用于对象的集合。

这是JSBin

据我所知,问题在于每次都会因为angular.copy而返回一个新对象。但为什么它适用于原始价值?

我有什么想法可以解决这个问题吗?

2 个答案:

答案 0 :(得分:1)

它适用于基元的原因是JS按值传递基元,而不是通过引用。问题可以通过lodash(_ library)memoize函数来解决。 This page使用memoize详细说明了确切的问题和解决方案。

答案 1 :(得分:0)

我解决了我的问题,但因为有许多类似的问题没有答案,我决定发表我的答案。

解决问题的关键是ng-repeat既不使用$ watch也不使用$ watch和Equality。它使用$ watchCollection来收集集合=)。在我的情况下,当过滤器返回具有原始值的新复制对象时,$ watchCollection不会触发(在这种情况下标准的$ watch),所以我避免了无限的$ digest循环。但是如果具有对象值$ watchCollection的对象触发无限$ digest循环($ watch with Equality = true则不会)。

这是jsbin