我通过检查区域来节省任何费用吗?

时间:2017-07-06 18:40:38

标签: angular

我有一个全局函数,当我不知道代码的哪一部分是从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/

所以我继续使用上述功能,但想验证它是否需要。

1 个答案:

答案 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.innerangular区域)上调用任务会触发onEnter()onLeave()函数,这些函数管理嵌套级别并触发angular必要时区域转弯事件。

可以在此处找到ApplicationRef_源,其中应用了很多(全部?)Angular的主要挂钩进入区域转弯的位置: https://github.com/angular/angular/blob/c59c390cdcd825cca67a422bc8738f7cd9ad42c5/packages/core/src/application_ref.ts#L443

变更检测的关键声明是this.tick()ApplicationRef.tick()函数是触发更改检测周期的函数。