Angular ngZone或zone.js:猴子修补的地方?
我正在学习ngZone如何在Angular中工作。 我知道它是在对标准异步操作(比如setTimeout)进行猴子补丁 但是谁在做猴子修补术呢?zone.js库还是ngZone中的Angular自身?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
如果您能在源代码中显示它发生的具体位置,那将是非常棒的。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感谢您的更新,出于某种原因,我仍然无法grepsetTimeout
string。合乎逻辑的是,如果你覆盖了属性,你应该把它写下来,不是吗?它们似乎修补了计时器对象,而不是每个方法。