【问题标题】:Change detection stopped working in Electron app when using zone.js 0.9.1使用 zone.js 0.9.1 时,更改检测在 Electron 应用程序中停止工作
【发布时间】:2020-01-31 02:27:31
【问题描述】:

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

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

我意识到这是某种更改检测或区域问题,但其他一切正常。但无论出于何种原因,该区域无法识别模型更改,因此视图不会刷新,直到另一个动作(如点击)触发它。

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

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

而且它起作用了——在重新编译应用程序后,我现在看到视图在按钮单击和对话框打开时立即更新,就像它在 Angular 6 中所做的那样。

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

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

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

【问题讨论】:

  • 我没有解释升级后发生的情况,但可能与to this有关?它总是发生,还是仅在触发某些电子 api 事件后发生?可能 Electron 和 zone.js 还没有玩好。
  • 感谢您的建议 - 我确实尝试过,但最终发现这只是 zone.js 中的一个错误,现已在 0.10.2 中修补。我还是 Angular 的新手,还在学习组件。否则会发布 zone.js 版本,但当时甚至不知道那是什么。如果这浪费了任何人的任何周期,对不起!

标签: angular electron zonejs


【解决方案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 之后 @987654322 @error 消失了,变更检测工作正常。这完全是由于一些存根函数返回了undefined 而不是带有eventNames 的对象。

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

【讨论】:

    猜你喜欢
    • 2018-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-27
    • 1970-01-01
    相关资源
    最近更新 更多