从 IpcMain 通信时没有角度变化检测

pop*_*rap 2 ipc electron angular

我正在使用Angular / Electron构建一个应用程序。在 Angular 组件中,我有一个方法——handleData()定义一个对象——只是简单的数组、字符串、数字等,没有异步调用或任何类似的东西。那么这个对象的属性被用于创建和使用填充模板*ngFor*ngIf

在开发时,我在组件中有一个按钮,单击该按钮时handleData()直接调用并且一切正常 - 数据被创建,模板更新以反映它。有得到的东西建立这样我做一个简单的变化,使现在点击按钮通过发送消息IpcRenderer(使用IpcService中所述文章)...

onButtonClick(){
   this.ipc.on('test-response', (e)=>{
      this.handleData();
   });
   this.ipc.send('test-channel');
}
Run Code Online (Sandbox Code Playgroud)

这是在我的main.js,我回应它,​​发回一条消息......

ipcMain.on('test-channel', (e)=>{
   e.sender.send('test-response');
});
Run Code Online (Sandbox Code Playgroud)

在这种情况下handleData()仍然会被调用,现在 UI 不再更新。每当我更新通过或链接到模板的属性时,我都必须使用ChangeDetectorRef和手动调用。detectChanges*ngIf*ngFor

所以我的问题是,在 IPC 回调上调用方法与直接调用有什么不同?

这是同步/异步的事情吗?区?范围问题?

很高兴收到任何想法。

干杯

pop*_*rap 7

我使用NgZone. 如前所述,我可以使用,ChangeDetectorRef.detectChanges但每次更新后我都必须调用它,不仅在我的主要组件中,而且在它的所有后代中也如此,这似乎是错误的。

我阅读了一些文章,认为这可能是区域问题,因此我最终不得不尝试了解区域究竟是什么。我发现这篇文章及其中的链接对于获得基本的理解非常有帮助。

最后我注入NgZone了我的组件:

constructor(private zone:NgZone){}
Run Code Online (Sandbox Code Playgroud)

然后我确保回调在 Angular 区域中运行:

onButtonClicked(){
   this.ipc.on('test-response', (e)=>{
   this.zone.run(()=>{
      this.testFunc()
   });
});
this.ipc.send('test-channel');
Run Code Online (Sandbox Code Playgroud)

我不会假装我完全理解为什么会出现这个问题或为什么会解决这个问题。我假设获取Electronshell 并IpcMain涉及将程序移到 Angular 区域之外,并且不会返回回调。