【问题标题】:How does AngularJS $watch these cases in an ng-repeat?AngularJS 如何在 ng-repeat 中 $watch 这些案例?
【发布时间】:2013-03-16 19:02:38
【问题描述】:

我了解 AngularJS 在 ng-repeat 上设置了一些监视。此时设置的是什么类型的手表?

另外,有人能解释一下每种情况下会发生什么吗?如果我有很多物品,我想知道,这样用户就不会被如果我以其他方式编写它可能会被淘汰的手表所困扰。

一个

<div ng-repeat="item in items">
  <div>{{item.property}}</div>
</div>

两个

<div ng-repeat="item in items">
  <div>{{item.property | myFormatter}}</div>
</div>

三个

<div ng-repeat="item in items">
  <div>{{format(item.property)}}</div>
</div>

四个

<div ng-repeat="item in items">
  <div>{{item.something()}}</div>
</div>

【问题讨论】:

    标签: angularjs


    【解决方案1】:

    每个ng-repeat 都会在items 上设置一个$watch。 (如果你看ng-repeat source code,大部分是$watch方法的watchExpression函数)。每次 Angular digest cycle 运行时,items 中的每个 item 都会被这个监视函数检查。 (注意,在一个摘要循环中,这个 watch 函数可以被多次调用)。

    每个{{}} 设置一个$watch。如果像 item.property 这样的内容在 {{}} 中,则每个摘要周期至少会对其进行一次脏检查。

    如果一个函数在 {{}} 内,则该函数在每个摘要循环中至少调用一次。

    我不确定x | filter,但this fiddle 似乎表明过滤器在每个摘要周期至少被调用一次,即使x 没有改变。

    【讨论】:

    • x | filter 太疯狂了。我不明白为什么会这样。也许他们认为过滤器不会是一个纯函数?
    • 我也很惊讶。
    • 更新了 ng-repeat 源代码的链接:github.com/angular/angular.js/blob/v1.6.x/src/ng/directive/…。看起来他们现在使用 $watchCollection 进行浅层检查。谢谢马克!
    猜你喜欢
    • 2015-11-05
    • 2017-12-22
    • 1970-01-01
    • 2016-05-15
    • 2018-08-13
    • 1970-01-01
    • 2013-11-23
    • 2021-10-08
    • 1970-01-01
    相关资源
    最近更新 更多