【问题标题】:Angular change detection zone.js角度变化检测 zone.js
【发布时间】:2018-10-24 15:06:08
【问题描述】:

对 Angular2+ 中有关 zone.js 的文章有疑问。我正在阅读article from blog.angular-university.io。我认为有些部分有点神秘,并且有一些问题,我不确定我是否理解正确。文章称:

区域只不过是一个存在的执行上下文 多个 Javascript VM 执行轮次。

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

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

Angular 正在运行时更改 async 函数(settimeout、AJAX 等)。这是否意味着除了完成回调的回调之外,Angular 还可以使用其他功能来检测更改

我目前的理解正确吗?如果不是,有什么问题?

【问题讨论】:

  • '执行上下文'与'this'无关。从字面上看,它是执行代码的上下文。区域补丁 asynchronous 功能,但 not async functions这是否意味着除了完成回调的回调 - 我不确定这意味着什么,但它会检测到 在调用结束时 任何异步 API 的更改。因此,是否有嵌套的同步函数调用并不重要。如果还有对异步 API 的调用,这些调用将被堆叠。

标签: javascript angular zone.js angular-changedetection


【解决方案1】:

上述语句是否意味着多个异步回调是 堆积在事件队列中有一个执行上下文,因此 这个值一样吗?

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

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

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

【讨论】:

    猜你喜欢
    • 2021-06-17
    • 2021-08-07
    • 1970-01-01
    • 1970-01-01
    • 2018-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-04
    相关资源
    最近更新 更多