我仍然遇到同样的问题,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
答案 0 :(得分:4)
这就是Angular的脏检查工作原理。如果您有500个项目的数组并且数组发生更改,则必须将过滤器重新应用于整个阵列。现在你想知道"为什么两次"?
这是正常的,angularjs使用'脏检查'方法,因此需要调用所有过滤器以查看是否存在任何更改。在此之后,它检测到一个变量(您键入的变量)有变化,然后再次执行所有过滤器以检测是否有其他变化。
它引用的答案:How does data binding work in AngularJS?
修改:如果你真的注意到了迟钝(我没有使用旧的Core 2 Duo PC),你可能会有很多创造性的方法可以解决它取决于你的UI将是什么。
onblur
而不是onkeypress
,如下所示:http://jsfiddle.net/langdonx/djtQR/1/