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