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

fxc*_*xck 8 javascript angularjs angularjs-scope angularjs-ng-repeat

我仍然遇到同样的问题,ng-repeat中的过滤器和函数被称为所有该死的时间.

这里的示例,http://plnkr.co/edit/G8INkfGZxMgTvPAftJ91?p = preview,无论何时在单行上更改内容,someFilter过滤器都会被调用1000次.

显然这是因为子范围的任何更改都会冒泡到其父级,导致$ digest运行,导致所有过滤器运行(/sf/answers/1115545371/).是对的吗?如何在我的特定情况下防止它发生?

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

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

//编辑清除了来自探测器的所有不必要的东西 http://plnkr.co/edit/G8INkfGZxMgTvPAftJ91?p=preview

Lan*_*don 4

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

来自另一个答案

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

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

编辑:如果您确实注意到速度缓慢(我在较旧的 Core 2 Duo PC 上没有遇到这种情况),那么根据您的 UI,您可能有多种创造性的方法可以解决它。

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