关于javascript:对angular的脏检查

Dirty checking on angular

我读了一些文章来了解Angular.js的工作原理。

我不明白的一个术语是"脏支票"。

到底是什么?它看起来像一个观察者模式,但显然更好。

你能帮我理解吗?

事先谢谢。

编辑:对于想了解更多信息的人来说,几年前在恩盖洛普观看这段视频也很有用。


从这个链接:

Angular defines a concept of a so called digest
cycle. This cycle can be considered as a loop, during which Angular
checks if there are any changes to all the variables watched by all
the $scopes. So if you have $scope.myVar defined in your controller
and this variable was marked for being watched, then you are
explicitly telling Angular to monitor the changes on myVar in each
iteration of the loop.

这个"digest也称为"脏检查",因为在某种程度上,它扫描范围中的变化。我不能说这是为了更好还是为了更糟糕的观察模式。这取决于你的需要。

一些链接:

  • 角度文件
  • 关于角度范围的博客文章

角度脏检查机制工作流。

enter image description here

Dirty checking is a simple process that boils down to a very basic
concept: It checks whether a value has changed that hasn’t yet been
synchronized across the app.

Our Angular app keeps track of the values of the current watches.
Angular walks down the
$watch list, and, if the updated value has not changed from the old
value, it continues down the list. If the value has changed, the app
records the new value and continues down the $watch list.

在这里查看整篇文章


什么是脏支票?

检查每个表以检测更改的过程称为脏检查。可能有两种情况

第一——

  • 从列表中获取手表
  • 检查项目是否已更改
  • 如果项目没有变化,那么
  • 未采取任何操作,请移至监视列表中的下一项
  • 第二

  • 从列表中获取手表
  • 检查项目是否已更改
  • 如果项目发生变化
  • 需要更新dom,返回摘要循环
  • 在第二种情况下,循环将继续,直到在整个循环中找不到任何更改为止。完成后,如果需要,DOM会得到更新。


    只是修改以前的答案…

    角度有一个"消化循环"的概念。你可以把它当作一个循环。其中,angular检查所有$scope监视的所有变量是否有任何更改(内部$watch()和$apply()函数与$scope下定义的每个变量绑定在一起)。

    因此,如果您在控制器中定义了$scope.myvar(这意味着这个变量"myvar"被标记为被监视),那么您就显式地告诉angular监视循环每次迭代中"myvar"的更改。因此,当"myvar"的值更改时,每次$watch()通知并执行$apply()以应用DOM中的更改。

    这个"摘要"也被称为"脏检查",因为在某种程度上,它扫描范围中的更改。由于所有被监视变量都在一个循环中(摘要循环),任何变量的任何值更改都会强制重新分配DOM中其他被监视变量的值。

    优点:这是Angular实现双向数据绑定的方式。

    缺点:如果在一个页面中有更多被关注的变量(>2000-3000),那么在页面加载时可能会看到延迟。(但我说,如果在一个页面中有那么多"被关注的变量",那么这是一个糟糕的页面设计:p)。

    还有其他的缺点,以及解决方法:d


    我在这篇博文里读了一篇关于脏检查的好文章。也有这样的答案

    版本

    当$digest循环开始时,观察者将检查作用域模型中的任何更改,如果存在任何更改(更改也可能来自角度域之外),则执行相应的侦听器函数。这将再次运行$digest循环并检查作用域模型是否被更改(listener函数也可以修改作用域模型)。

    总的来说,$digest循环将运行两次,即使监听器不更改模型或者直到达到最大循环计数10。


    脏检查将检查$scope变量中的任何更改并将其更新到DOM。这由AngularJS完成,您还可以自己实现脏检查。