Angular.js更改了一个ng-repeat项,导致所有其他项运行过滤器

时间:2013-04-22 13:05:41

标签: javascript angularjs angularjs-scope angularjs-ng-repeat

我仍然遇到同样的问题,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

1 个答案:

答案 0 :(得分:4)

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

来自another answer

  

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

它引用的答案:How does data binding work in AngularJS?

修改:如果你真的注意到了迟钝(我没有使用旧的Core 2 Duo PC),你可能会有很多创造性的方法可以解决它取决于你的UI将是什么。

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