gpt4 book ai didi

angular - 从 IpcMain 通信时没有 Angular 变化检测

转载 作者:行者123 更新时间:2023-12-03 12:21:07 25 4
gpt4 key购买 nike

我正在使用 Angular/Electron 构建应用。在 Angular 组件中,我有一个方法 - handleData() - 定义一个对象 - 只是简单的数组、字符串、数字等,没有异步调用或任何类似的水果。然后使用此对象的属性使用 *ngFor*ngIf 创建和填充模板。

在开发过程中,我在组件中有一个按钮,单击该按钮会直接调用 handleData() 并且一切正常 - 创建数据,更新模板以反射(reflect)它。像这样设置后,我做了一个简单的更改,以便现在单击按钮通过 IpcRenderer 发送消息(使用 this article 中描述的 IpcService)...

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

这是在我的 main.js 中获取的,我响应它,发回消息...

ipcMain.on('test-channel', (e)=>{
e.sender.send('test-response');
});

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

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

这是一个同步/异步的东西吗?区?范围问题?

很高兴收到任何想法。

大家好

最佳答案

我使用 NgZone 修复了这个问题。如前所述,我本可以使用 ChangeDetectorRef.detectChanges,但我不得不在每次更新后调用它,不仅在我的主要组件中,而且在它的所有后代中,这似乎是错误的。

我阅读了一些文章,认为这可能是区域问题,因此我最终不得不尝试了解区域的实际含义。我找到了 this article and the links within it对于获得基本的理解非常有帮助。

最后,我将 NgZone 注入(inject)到我的组件中:

constructor(private zone:NgZone){}

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

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

我不会假装我完全理解为什么会出现这个问题或者为什么会解决这个问题。我假设让 Electron shell 和 IpcMain 参与将程序移到 Angular 区域之外,并且不会返回回调。

关于angular - 从 IpcMain 通信时没有 Angular 变化检测,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50310447/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com