使用 zone.js 0.9.1 时,更改检测在 Electron 应用程序中停止工作

Change detection stopped working in Electron app when using zone.js 0.9.1

我更新了一个我最近从 Angular 6 继承的 Electron 应用程序到 Angular 8。使用 zone.js 0.9.1(更新:根本原因是这个版本中的错误zonejs - 请参阅下面我的自我回答)

遵循升级指南等,编译所有内容并运行宁美 - 直到我开始触发更新模型的操作并注意到视图没有立即更新。我注意到的行为是,如果我执行诸如单击选项卡或打开对话框或单击按钮之类的操作,视图不会更新,直到我单击其他内容。

我意识到这是某种变化检测或区域问题,但其他一切正常。但无论出于何种原因,该区域无法识别模型更改,因此直到单击等其他操作触发它时,视图才会刷新。

我有一些在 Angular 之外进行更改后处理更新视图的经验,因此我尝试在区域承诺中包装多个事件处理程序,如下所示:

this.zone.run(() => ...do the stuff it was doing before... )

它成功了 - 在重新编译应用程序后,我现在看到视图在单击按钮和打开对话框时立即更新,就像在 Angular 6.

中一样

但后来我发现很多我没有自己的处理程序的更改也不起作用,例如更改 mat-tab-group 内的选项卡和默认对话框按钮。

所以这变成了一个兔子洞 - 我可能可以为每个选项卡点击和按钮点击实现自定义事件处理程序,但这似乎是一个巨大且不必要的痛苦,尤其是考虑到我没有对应用程序逻辑本身,只是升级到 Angular 8。我可能忘记了什么或者有一个 weird/special 案例,因为它是一个电子应用程序(我没有 运行最近使用相同的过程将 Web 应用程序从 angular 6 转换为 8 时出现问题。

我被难住了。希望社区可以指出我的问题和解决方案 - 如果一切都失败了,我想我会编写大量自定义处理程序并将每一行代码包装在 this.zone.run(()=>...) 中 - 谢谢!

因为我已经修复了很多与 Angular 2 版本跳转相关的问题,所以我忽略了一个控制台错误 ("Cannot read property 'eventNames' of undefined"),起初我认为它是无关紧要的,但是,呃,注意到堆栈中的 zone.js。

进行了更多研究,发现这是 zone.js 版本 0.9.1 和 Electron 的一个已知问题(参见 https://github.com/angular/angular/issues/31626

我之所以使用那个版本是因为一个并行项目(非 Electron)工作正常并且在 0.9.1 上,所以出于某种原因我想让它们保持同步,但是在更新到 0.10.2 之后eventNames 错误消失了,变化检测工作正常。这都是由于某些存根函数返回了 undefined 而不是带有 eventNames 的对象。

感谢阅读;更新到最新的工作,幸运的是这个问题在几周前就得到了解决。