Electron-Angular 在 ipc 事件上打开客户端对话框

Electron-Angular open client-side dialog on ipc event

我有一个弹出客户端 angular-material 对话框组件的后端通知。有时,但并非总是如此,对话框不会完全实例化。调用组件的构造函数,但在对话框关闭之前不会调用生命周期中的任何其他内容。有时它工作得很好并且 ngOnInit 也被调用。

具有 ipc 订阅的组件如下所示(我也尝试过 setTimeout 并使用 Observable,但都没有成功):

api.receive('hotkey', (event, arg) => {
  this.onHotkey(shortcut as Shortcut);
});
api.send('setHotkeyListener');

热键实现调用与执行 this.dialog.open(...) 业务的按钮相同的方法。

api通过preload.js中的contextBridge实现如下:

const {
  contextBridge,
  ipcRenderer
} = require("electron");

// Expose protected methods that allow the renderer process to use
// the ipcRenderer without exposing the entire object
contextBridge.exposeInMainWorld(
  "api", {
    sendSync: (channel, data) => {
      return ipcRenderer.sendSync(channel, data);
    },
    send: (channel, data) => {
      ipcRenderer.send(channel, data);
    },
    receive: (channel, func) => {
      ipcRenderer.on(channel, (...args) => func(...args));
    }
  }
);

我假设问题是 angular 不是从 ipcRenderer 代码路径中获取的某些缺失的上下文;你知道我错过了什么吗?

这很难找到,但很容易修复。希望我的问题也能帮助其他人指明正确的方向。我需要使用 NgZone 让 angular 知道它需要检测变化。

import { NgZone, OnInit } from '@angular/core';

// ...

declare const api: any;

export class AppComponent implements OnInit {
  constructor(private ngZone: NgZone) {}
  ngOnInit() {
    api.receive('hotkey', (event, arg) => {
      this.ngZone.run(() => this.onHotkey(arg as Shortcut));
    });
    api.send('setHotkeyListener');
  }
  // ...
}