为什么Angular过滤器运行两次



下面是我在学习Angular时从一个例子中设置的一些简单示例代码。

jsFiddle链接

几个问题:

  1. 它如何知道运行categoryFilterFn。我猜任何绑定到html视图和$scope的东西都会以某种方式执行,"以防"发生更改。

  2. 为什么过滤器运行两次?如果运行该示例,您将看到四种产品的八条控制台语句。即使我把它全部移到一个控制器中,它仍然会这样做。

它是如何知道运行categoryFilterFn的。我猜任何东西都有约束力到html视图,$scope以某种方式只是"以防万一"执行有变化。

是的,Angular摘要循环会进行脏检查,看看是否有什么变化。它在监视队列上执行此操作(并且根据它们是否绑定在UI中来将它们放入监视队列(。

为什么过滤器运行两次?如果你运行这个例子,你会看到四种产品的八个控制台语句。即使我把它全部移走在一个控制器中,它仍然这样做。

Angular再次使用脏检查(这里有一篇关于它的好文章(。从本质上讲,在摘要周期开始期间,监视的值会被解析。然后,在摘要周期结束时,再次解析该值(这是第二次调用(。如果值不匹配,则UI将替换为新值。简单地说,这就是双向绑定的工作方式。