8

我仍然遇到同样的问题,ng-repeat 中的过滤器和函数一直被调用。

此处的示例http://plnkr.co/edit/G8INkfGZxMgTvPAftJ91?p=preview,只要您在一行中更改某些内容,someFilter就会调用过滤器 1000 次。

显然这是因为子范围的任何更改都会冒泡到其父范围,导致 $digest 运行,导致所有过滤器运行(https://stackoverflow.com/a/15936362/301596)。那正确吗?在我的特定情况下如何防止它发生?

如何使其仅在已更改的项目上运行?

在我的实际用例中,即使更改甚至不在 ng-repeat 的项目上也会调用过滤器,它是如此毫无意义,它实际上会导致性能问题..

// 编辑从 plunker 中清除了所有不必要的东西 http://plnkr.co/edit/G8INkfGZxMgTvPAftJ91?p=preview

4

1 回答 1

4

这就是 Angular 的脏检查的工作原理。如果您有一个包含 500 个项目的数组并且数组发生更改,则必须将过滤器重新应用于整个数组。现在你想知道“为什么两次”?

另一个答案

这是正常的,angularjs 使用了 'dirty-check' 方法,所以它需要调用所有的过滤器来查看是否存在任何变化。在此之后,它检测到一个变量(您键入的变量)发生了变化,然后再次执行所有过滤器以检测是否有其他变化。

以及它引用的答案:数据绑定在 AngularJS 中是如何工作的?

编辑:如果您真的注意到迟缓(我不是在较旧的 Core 2 Duo PC 上),可能有许多创造性的方法可以解决它,具体取决于您的 UI 将是什么。

  1. 您可以在用户编辑数据时将行置于编辑模式以隔离更改,并在用户退出编辑模式时同步模型备份
  2. 您只能更新模型onblur而不是onkeypress使用指令,如下所示:http: //jsfiddle.net/langdonx/djtQR/1/
于 2013-04-22T13:46:02.903 回答