我有一个全局函数,当我不知道代码的哪一部分是从Angular外部运行时,我可以在Angular区域内运行一个函数。
这里的功能是:
export class Zones {
public static maybe(zone: NgZone, callee: () => any) {
return NgZone.isInAngularZone()
? callee()
: zone.run(callee);
}
}
开始使用此功能后。我开始怀疑这项检查是否多余。也许NgZone.run()
方法已调用isInAngularZone
并执行上述逻辑。
我尝试查看Angular源代码,但区域由另一个库处理,我试图遵循执行路径而迷路。
这是区域项目:
https://github.com/angular/zone.js/
所以我继续使用上述功能,但想验证它是否需要。
答案 0 :(得分:2)
NgZone.run()
只是Zone.prototype.run()
区域的angular
代理,不会阻止其他框架。相反,它跟踪当前angular
区域的嵌套深度,以便它可以推迟区域转弯操作(例如,更改检测),直到angular
区域内的所有帧都完成为止。因此,在某些情况下,你的后卫会提供小的性能提升。请记住,添加额外区域框架的成本应该非常小,因此这对于频繁调用的函数可能最有用。
NgZone
来源可在此处找到:
https://github.com/angular/angular/blob/bebedfed24d6fbfa492e97f071e1d1b41e411280/packages/core/src/zone/ng_zone.ts#L233
在NgZone.inner
(angular
区域)上调用任务会触发onEnter()
和onLeave()
函数,这些函数管理嵌套级别并触发angular
必要时区域转弯事件。
可以在此处找到ApplicationRef_
源,其中应用了很多(全部?)Angular的主要挂钩进入区域转弯的位置:
https://github.com/angular/angular/blob/c59c390cdcd825cca67a422bc8738f7cd9ad42c5/packages/core/src/application_ref.ts#L443
变更检测的关键声明是this.tick()
。 ApplicationRef.tick()
函数是触发更改检测周期的函数。