加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

如何在AngularJS摘要循环中处理观察者和过滤器?

发布时间:2020-12-17 07:07:35 所属栏目:安全 来源:网络整理
导读:我知道范围观察者和过滤器都在摘要循环中重复执行.但是以下对我来说有点不清楚: 他们执行相同数量的周期吗? 两者都是由同样的情况引发的吗? 解决方法 每个摘要周期都会检查手表. $watch可以观看 Angular expression.在表达式中可以有一个 filter Angular
我知道范围观察者和过滤器都在摘要循环中重复执行.但是以下对我来说有点不清楚:

>他们执行相同数量的周期吗?
>两者都是由同样的情况引发的吗?

解决方法

每个摘要周期都会检查手表. $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而再次检查该结果是否需要传播.如果该传播导致任何更改,那么手表和过滤器将再次运行,直到没有任何变化.

当然,如果多个观察的表达式使用相同的过滤器,那么对于每个表达式,将按照上述方式运行该过滤器.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读