角度变化检测zone.js

时间:2018-05-14 21:10:00

标签: javascript angular zone.js angular-changedetection

对Angular2 +中有关zone.js的文章提出疑问。我正在读article from blog.angular-university.io。我觉得有些部分有点神秘,对它有些疑问,我不确定我是否理解正确。文章指出:

  

区域只不过是一个幸存的执行环境   多个Javascript VM执行转。

上述语句是否意味着堆叠在事件队列中的多个异步回调具有一个执行上下文,因此this具有相同的值?

  

它是我们可以用来添加额外功能的通用机制   到浏览器。 Angular在内部使用区域来触发更改   检测

Angular正在运行时更改async函数(settimeout,AJAX等)。这是否意味着除了完成回调的回调之外还有Angular用来检测变化的附加功能

我目前的理解是否正确?如果没有,那有什么不对?

1 个答案:

答案 0 :(得分:1)

  

上述语句是否表示多个异步回调   堆叠在事件队列中有一个执行上下文,因此   这个价值相同吗?

没有。将执行上下文简单地(过度简化)视为一个对象,该对象由在特定区域中运行的所有代码共享。对于例如在bootstrap期间,当角度模块初始化时,Angular会创建(分叉)一个名为“angular”的区域。此外,它设置属性'isAngularZone':true。你可以把它想象成创建一个设置了新属性的对象。现在,此属性将可用于Angular中运行(或计划运行)的所有代码,因为它在角度区域中运行。但是,如果在角度区域外运行代码,则无法访问此属性。

  

这是否意味着除了完成回调的回调之外   还具有Angular用于检测更改的其他功能

回调没有任何其他功能。它是Zone.js处理回调的方式,它提供Angular附加功能,例如确定何时启动更改检测周期。例如。当你在setTimeout函数中传递回调时,它被Zone.js包装在另一个函数中,并且代替你的回调代替它。这是monkey patching API。现在,当JS VM调用Zone.js包装回调时,它会在实际调用您的回调方法之前执行各种操作。其中一个操作是通知调用回调的区域(调度回调)。在这里,如果该区域是“有角度的”,它将生成事件并将启动变化检测周期。