在将基于Angular2 + Polymer1的大型客户端项目从Angular2 beta升级到stable之后,我注意到Angular的(eventname)
DOM属性在 NgZone 之外触发了函数使用Safari以及RxJS的回调(subscribe
,map
)。
这是一个问题,因为这意味着我必须使用NgZone.run()
调用来包装每个更改模板绑定变量的函数,仅限Safari用户(iOS和桌面),否则Safari用户(+ iPhone)必须触发通过在屏幕上随机点击来更改检测事件。
在Chrome上,功能在NgZone内部调用(通过执行NgZone.isInAngularZone()
验证)。
是否为Safari提供了更优雅的解决方案(除了使用NgZone.run()
打包所有来电)?
上传样本以重现此问题(Angular2 + Polymer)。 https://github.com/aabluedragon/safari-ngzone-issue
我设法通过在(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
答案 0 :(得分:1)
原因是Safari在XMLHttpRequestEventTarget中实现了addEventListener,我已经做了PR修复它。 https://github.com/angular/zone.js/pull/672