lui*_*ati 3 angularjs angularjs-scope angularjs-filter
我知道范围观察者和过滤器都在摘要循环中重复执行.但是以下对我来说有点不清楚:
他们执行相同数量的周期吗?
两者都是由同样的情况引发的吗?
每个摘要周期都会检查手表.并且$watch
可以观看Angular表达.在表达式中,可以有一个过滤器,Angular必须评估(使用$interpolate
)以确定观察的表达式是否已更改.
两者都是由同样的情况引发的吗?
因此,过滤器不是直接运行,$digest
而是由于运行而运行$watch
.实际上,过滤器是由观察表达式的评估触发的.
过滤器在性能方面特别谈到了几个原因$digest
.看看这两个表达式:
表达式1: {{searchText+2}}
表达式2: {{searchText | myFilter:true}}
每次$digest
触发时都会评估两个表达式.因此,一个风险区域myFilter
可能很复杂,最终会使用比简单更多的处理器周期(如上面的+2).
不那么明显,如果过滤器不是幂等的,那么过滤器可能会导致所有观察者的额外运行.$digest
如果任何手表导致更改,则设置脏位的每次运行.如果设置了脏位,它会再次重新运行所有手表.这允许传播任何更改.例如,如果searchText
由其中一个手表改变,那么Angular需要给所有其他观察者一个机会,看看他们的结果是否依赖于searchText
因此应该改变.
这就是上面的表达式1和2之间的区别.在最糟糕的情况下,想象会myFilter
返回一个随机数. $digest
运行时,在评估手表时会看到更改(过滤器的上一个结果与新结果不匹配),因此它会再次通过监视列表.因为过滤器返回一个随机数,所以结果很可能会发生变化,从而触发另一次运行$digest
.等等...... Angular在通过它的观察列表进行10次循环之后有一个内置的停止 - 它表示如果结果在10次尝试后没有稳定则出现问题,因此它会放弃投掷"错误:10 $ digest()迭代到了.堕胎!"
他们执行相同数量的周期吗?
因此,每个观察表达式(包括任何过滤器)至少运行两次$digest
.一旦因为触发的更改$digest
而再次检查该结果是否需要传播.如果该传播导致任何更改,则手表和过滤器将再次运行,直到没有任何变化.
当然,如果多个观察的表达式使用相同的过滤器,那么对于每个表达式,将按照上述方式运行该过滤器.
归档时间: |
|
查看次数: |
785 次 |
最近记录: |