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

Array filter cause infinite $digest loop

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

我需要在 html table 中使用动态列呈现集合。我为此制作了一个过滤器,但它适用于具有原始对象值的集合,并导致无限的 $digest 循环(请参阅控制台)用于收集对象。

这是一个JSBin

我知道问题是由于 angular.copy 每次都返回一个新对象。但为什么它适用于原始价值呢?

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

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

我解决了我的问题,但是因为有很多类似的问题没有答案所以我决定 post 我的答案。

解决问题的关键是 ng-repeat 既不使用 $watch 也不使用 $watch with Equality。它使用 $watchCollection 来观察集合 =)。在我的例子中,当 filter returns 具有原始值 $watchCollection 的新复制对象不触发时(在这种情况下标准 $watch 做)所以我避免无限 $digest 循环。但是万一具有对象值 $watchCollection 的对象触发无限 $digest 循环($watch with Equality=true 则不会)。

这里是jsbin