我已将最近从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(()=>...)
中-谢谢!
答案 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
的对象。
感谢阅读;更新到最新的工作方式,幸运的是,该问题已在几周前解决。