如何在AngularJS摘要循环中处理观察者和过滤器?
我知道范围观察者和过滤器都在摘要循环中重复执行.但是以下对我来说有点不清楚:
>他们执行相同数量的周期吗? 解决方法
每个摘要周期都会检查手表. $watch可以观看
Angular expression.在表达式中可以有一个
filter Angular必须评估(使用
$interpolate )以确定观察的表达式是否已经改变.
两者都是由同样的情况引发的吗? 因此,过滤器不是由$digest直接运行,而是由于$watch而运行.实际上,过滤器是由观察表达式的评估触发的. 过滤器在$digest的性能方面特别谈到了一些原因.看看这两个表达式: 表达式1:{{searchText 2}} 表达式2:{{searchText | myFilter:真正}} 每次触发$digest时都会评估这两个表达式.因此,一个风险区域就是myFilter可能很复杂并最终使用比简单更多的处理器周期(如上面的2). 不那么明显,如果过滤器不是幂等的,那么过滤器可能会导致所有观察者的额外运行.在$digest的每次运行中,如果任何手表导致更改,则设置脏位.如果设置了脏位,它会再次重新运行所有手表.这允许传播任何更改.例如,如果其中一个手表改变了searchText,那么Angular需要给所有其他观察者一个机会,看看他们的结果是否依赖于searchText,因此应该改变. 这就是上面的表达式1和2之间的区别.在最糟糕的情况下,想象myFilter会返回一个随机数. $digest运行,在评估监视时看到更改(过滤器的上一个结果与新结果不匹配),因此它再次通过监视列表.因为过滤器返回一个随机数,所以结果很可能会发生变化,从而触发另一次$digest运行.等等…… Angular在通过它的观察列表进行10次循环之后有一个内置的停止 – 它表示如果结果在10次尝试之后没有稳定则出现问题,因此它会放弃投掷“错误:10 $digest()迭代到了.堕胎!“ 他们执行相同数量的周期吗? 因此,每个$digest运行两次每个观察到的表达式(包括任何过滤器).一旦因为更改触发$digest而再次检查该结果是否需要传播.如果该传播导致任何更改,那么手表和过滤器将再次运行,直到没有任何变化. 当然,如果多个观察的表达式使用相同的过滤器,那么对于每个表达式,将按照上述方式运行该过滤器. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |