gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 07:56:30 27 4
gpt4 key购买 nike

我知道范围观察器和过滤器都在摘要循环中重复执行。但是以下内容对我来说有点不清楚:

  • 它们执行的周期数是否相同?

  • 两者都是由相同的情况触发的吗?

最佳答案

每个摘要周期都会检查 watch 。 $watch 可以观看 Angular expression .在表达式中可以有一个 filter哪个 Angular 必须评估(使用 $interpolate )来决定监视的表达式是否已更改。

两者都是由相同的情况触发的吗?

因此,过滤器不是由 $digest 直接运行,而是作为 $watch 的结果运行。实际上,过滤器是由监视表达式的评估触发的。

过滤器在 $digest 的性能方面被特别讨论的原因有几个。查看这两个表达式:

表达式 1:{{searchText+2}}

表达式 2:{{searchText | myFilter:true}}

每次触发 $digest 时都会计算这两个表达式。因此,一个风险领域就是 myFilter 可能很复杂,最终会比简单的东西(如上面的 +2)使用更多的处理器周期。

不太明显的是,如果过滤器不是幂等的,它可能会导致所有观察者额外运行。在每次运行 $digest 时,如果任何监视导致更改,就会设置脏位。如果设置了脏位,它会再次重新运行所有 watch 。这允许传播任何更改。例如,如果 searchText 被其中一个 watch 更改,那么 Angular 需要给所有其他 watcher 一个机会,看看他们的结果是否依赖于 searchText 并因此应该改变。

这就是上面表达式 1 和 2 之间的区别。想象一下最坏的情况 myFilter 返回一个随机数。 $digest 运行,在评估监视时看到变化(过滤器的先前结果与新结果不匹配),因此它再次运行监视列表。因为过滤器返回一个随机数,所以它的结果很可能已经改变,触发了 $digest 的另一次运行。等等,等等... Angular 在它的监视列表中循环 10 次后有一个内置的停止 - 它计算出如果结果在 10 次尝试后不稳定那么有问题所以它放弃抛出“错误:10 $ 摘要()达到迭代次数。中止!”

它们执行的周期数是否相同?

因此,在每个 $digest 中,每个监视的表达式(包括任何过滤器)至少运行两次。一次是因为触发了 $digest 的变化,一次是为了检查结果是否需要传播。如果传播导致任何变化,那么监视和过滤器将再次运行,直到没有任何变化。

当然,如果多个监视的表达式使用相同的过滤器,那么将按照上面的步骤为每个表达式运行该过滤器。

关于angularjs - AngularJS 摘要循环中如何处理观察者和过滤器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19394621/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com