Angular2 domevents + rxjs回调发生在Safari

时间:2017-03-09 16:47:02

标签: angular zonejs

在将基于Angular2 + Polymer1的大型客户端项目从Angular2 beta升级到stable之后,我注意到Angular的(eventname) DOM属性在 NgZone 之外触发了函数使用Safari以及RxJS的回调(subscribemap)。

这是一个问题,因为这意味着我必须使用NgZone.run()调用来包装每个更改模板绑定变量的函数,仅限Safari用户(iOS和桌面),否则Safari用户(+ iPhone)必须触发通过在屏幕上随机点击来更改检测事件。

在Chrome上,功能在NgZone内部调用(通过执行NgZone.isInAngularZone()验证)。

是否为Safari提供了更优雅的解决方案(除了使用NgZone.run()打包所有来电)?

上传样本以重现此问题(Angular2 + Polymer)。 https://github.com/aabluedragon/safari-ngzone-issue

更新(2017年3月11日)

我设法通过在(domevents)而不是webcomponentsjs index.html中加入angular-cli.json polyfill来解决NgZone之外的两个问题之一scripts:[] } 部分。 普通复制和粘贴:<script src="static/bower_components/webcomponentsjs/webcomponents-loader.js"></script>

然而Http.post回调仍然在NgZone之外调用,虽然我注意到如果我只是删除了webcomponentsjs polyfill,那么回调就会在NgZone中执行!

现在只有在我使用webcomponents <=0.7.24时才会出现此问题,因为这是Polymer1所依赖的。 但是我尝试使用webcomponents 1.0.0-rc.6然后问题就消失了,RxJS回调在NgZone里面!但是聚合物1元素(例如纸元素)不起作用,所以我仍然没有解决方案。

相应地更新了github中的项目示例。

在github上提交了一个问题: https://github.com/angular/zone.js/issues/671

1 个答案:

答案 0 :(得分:1)

原因是Safari在XMLHttpRequestEventTarget中实现了addEventListener,我已经做了PR修复它。 https://github.com/angular/zone.js/pull/672