使用zone.js 0.9.1

时间:2019-10-01 19:04:40

标签: angular electron zonejs

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

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

我意识到这是某种变更检测或区域问题,但是其他所有东西都正常工作。但是无论出于何种原因,该区域都无法识别模型的变化,因此,直到单击之类的其他动作触发了视图,视图才得以刷新。

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

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

而且有效-重新编译应用程序后,我现在看到单击按钮并打开对话框后视图立即更新,就像在Angular 6中一样。

但是后来我发现我没有自己的处理程序的许多更改也无法正常工作,例如更改mat-tab-group内的选项卡和默认对话框按钮。

所以这变成了一个兔子洞-我可能可以为每个单击选项卡和单击按钮实现自定义事件处理程序,但这似乎是一个巨大而不必要的痛苦,尤其是考虑到我没有对应用程序进行任何更改逻辑本身,只是对Angular 8的升级。可能是我遗忘了某些东西,或者遇到了怪异/特殊的情况,因为它是电子应用程序(最近将Web应用程序从angular 6转换为8时,我没有遇到这些问题。使用相同的过程)。

我很困惑。希望社区能够指出我的问题和解决方案-如果所有其他方法都失败了,我想我会写很多自定义处理程序,并将每一行代码都包装在this.zone.run(()=>...)中-谢谢!

1 个答案:

答案 0 :(得分:1)

因为我已经解决了许多与Angular 2版本跳转相关的问题,所以我忽略了一个控制台错误(“无法读取未定义的属性'eventNames'”),我一开始就认为这是无关的,但是,注意到堆栈中的zone.js。

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

由于并行项目(非Electron)运行良好且在0.9.1上运行,我之所以仅使用该版本,所以我出于某种原因希望使它们保持同步,但是在更新为0.10.2之后,{{ 1}}错误消失了,更改检测正常工作。都是由于某些存根函数返回了eventNames而不是返回了undefined的对象。

感谢阅读;更新到最新的工作方式,幸运的是,该问题已在几周前解决。