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');
}
// ...
}
我有一个弹出客户端 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');
}
// ...
}