我最近开始使用升级模块将AngularJS应用程序迁移到Angular 4。
我的一个AngularJS指令使用第三方库(ngFlow)使用XMLHttpRequest.send()
上传文件。在混合模式下运行时,上传功能可以在Chrome和Firefox中正常运行。但是,在Safari中,应用程序在上载期间变得非常慢,并且浏览器进程达到100%使用的CPU。
使用Safari网络工具,我看到很多来自zone.js的globalZoneAwareCallback
调用。
我的印象是Angular区域正在启动上传过程中发生的每个XMLHttpRequest
进度事件的变化检测。
我知道我可以使用来自runOutsideAngular
的NgZone
来避免这种情况,但我不知道如何在第三方AngularJS库中发生异步调用的情况下使用它,或者是否有任何其他解决方案来解决这个问题。
最后,我设法使用runOutsideAngular
解决了这个问题。
首先,我降级了NgZone模块,以便在我的AngularJS代码中使用它:
factory('ngZone', downgradeInjectable(NgZone));
然后我在upload指令中注入了服务并使用它来运行Angular区域中的文件上传:
ngZone.runOutsideAngular(() => $flow.upload());
为了避免$digest
和性能的所有问题,我建议使用downgradeModule - 它在Angular区域之外引导AngularJS并保持两个变化检测系统分开。