Angular ngZone或zone.js:猴子修补的地方?

Angular ngZone或zone.js:猴子修补的地方?,angular,zone.js,ngzone,Angular,Zone.js,Ngzone,我正在学习ngZone如何在Angular中工作。 我知道它是在对标准异步操作(比如setTimeout)进行猴子补丁 但是谁在做猴子修补术呢?zone.js库还是ngZone中的Angular自身? 如果您能在源代码中显示它发生的具体位置,那将是非常棒的。Angular在zone.js中运行zone,zone.js提供了一个带有补丁API的作用域 您可以自己使用zone.run(…)而不使用Angular中的任何内容,并获得修补API的所有效果 另见 修补计时器的代码 Angular在zone

我正在学习ngZone如何在Angular中工作。 我知道它是在对标准异步操作(比如setTimeout)进行猴子补丁

但是谁在做猴子修补术呢?zone.js库还是ngZone中的Angular自身?
如果您能在源代码中显示它发生的具体位置,那将是非常棒的。

Angular在zone.js中运行zone,zone.js提供了一个带有补丁API的作用域

您可以自己使用
zone.run(…)
而不使用Angular中的任何内容,并获得修补API的所有效果

另见

修补计时器的代码

Angular在zone.js中运行zone,zone.js提供了一个带有补丁API的作用域

您可以自己使用
zone.run(…)
而不使用Angular中的任何内容,并获得修补API的所有效果

另见

修补计时器的代码

区域库必须在浏览器和服务器端项目中工作。所以这比修补全局函数要复杂一些

Zone不仅修补全局API,还修补广播时的事件对象。通过
区域进行配线。uu加载\u配线
,您可以看到这些模块中正在配线的内容


这显然不是一个简单的过程。我确信仍然有一些边缘案例尚未修补

区域库必须在浏览器和服务器端项目中工作。所以这比修补全局函数要复杂一些

Zone不仅修补全局API,还修补广播时的事件对象。通过
区域进行配线。uu加载\u配线
,您可以看到这些模块中正在配线的内容


这显然不是一个简单的过程。我确信仍然有一些边缘案例尚未修补

猴子补丁由Zone.js完成。在ng_zone.ts中,加载zone.ts,创建根区域以及API

NGZone只是派生一个名为“”的子区域,并提供区域内规范。在这些回调中,将启动在应用程序和更改检测中进一步订阅的it事件

猴子补丁:这是通过调用带有2个参数的函数来完成的。第一个参数是monkey patched API的标识符,第二个参数是patch函数,执行该函数时,实际的浏览器API具有重新定义的版本

现在,这只是冰山一角。实际的魔法是通过调用utils.ts实现的。对于set/clearTimeOut情况,此操作已完成

在patchMethod()中,原始api保存在局部变量中,即,并返回相同的api,该api保存在timers.ts内的变量中

有关完整的工作流程,您可以参考下面的文章


猴子补丁由Zone.js完成。在ng_zone.ts中,加载zone.ts,创建根区域以及API

NGZone只是派生一个名为“”的子区域,并提供区域内规范。在这些回调中,将启动在应用程序和更改检测中进一步订阅的it事件

猴子补丁:这是通过调用带有2个参数的函数来完成的。第一个参数是monkey patched API的标识符,第二个参数是patch函数,执行该函数时,实际的浏览器API具有重新定义的版本

现在,这只是冰山一角。实际的魔法是通过调用utils.ts实现的。对于set/clearTimeOut情况,此操作已完成

在patchMethod()中,原始api保存在局部变量中,即,并返回相同的api,该api保存在timers.ts内的变量中

有关完整的工作流程,您可以参考下面的文章


所以setTimeoutOriginal!==设置超时?我在zone.js中找不到具体的位置,你能给我一行吗?@StepanSuvorov加载zone后你无法获得原始方法。这将是区域内部的,因为我从未见过获取原始对象的API。@MathewFoscarini假设我只在包含区域之后存储指向原始对象的链接。js@GünterZöchbauer感谢您的更新,出于某种原因,我仍然无法grep
setTimeout
string。如果您覆盖属性,您应该将其写下来,这是合乎逻辑的,不是吗?它们似乎修补了计时器对象,而不是每个方法。因此setTimeoutOriginal!==设置超时?我在zone.js中找不到具体的位置,你能给我一行吗?@StepanSuvorov加载zone后你无法获得原始方法。这将是区域内部的,因为我从未见过获取原始对象的API。@MathewFoscarini假设我只在包含区域之后存储指向原始对象的链接。js@GünterZöchbauer感谢您的更新,出于某种原因,我仍然无法grep
setTimeout
string。合乎逻辑的是,如果你覆盖了属性,你应该把它写下来,不是吗?它们似乎修补了计时器对象,而不是每个方法。