1

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

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

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

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

上传了一个示例以重现此问题(Angular2 + Polymer)。 https://github.com/aabluedragon/safari-ngzone-issue

更新(2017 年 11 月 3 日)

我设法解决了这两个问题之一 -(domevents)在 NgZone 之外,通过将 polyfill 包含webcomponentsjsindex.html而不是angular-cli.json'sscripts:[]部分中。普通复制粘贴:<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

4

1 回答 1

1

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

于 2017-03-12T10:20:14.777 回答