如何将消息发送到电子中的不同窗口?

时间:2019-11-21 12:55:36

标签: javascript npm electron

我正在写我的第一个电子应用程序,所以请宽容:)

当用户按下主窗口上的按钮时,应该打开一个显示一些json字符串的新窗口。 ipcMain解决了此事件:

while let

这是我创建新窗口的功能:

ipcMain.on("JSON:ShowPage", function(e, item) {
    createJSONWindow(item);
})

现在我的问题是,当我打开多个function createJSONWindow(item) { let jsonWin = new BrowserWindow({ width: 600, height: 800, center: true, resizable: true, webPreferences:{ nodeIntegration: true, show: false } }); jsonWin.loadFile("jsonView.html"); ipcMain.on('JSON_PAGE:Ready', function(event, arg) { jsonWin.webContents.send('JSON:Display', item); }) jsonWin.once('ready-to-show',()=>{ jsonWin.show() }); jsonWin.on('closed',()=>{ jsonWin = null; }); } 时,每个人都会收到JSONWindow消息并更新其内容。他们不应该彼此独立工作吗? JSON:Display始终是新的jsonWin,不是吗?

谢谢。

1 个答案:

答案 0 :(得分:1)

问题是此代码:

ipcMain.on('JSON_PAGE:Ready', function(event, arg) {
      jsonWin.webContents.send('JSON:Display', item);
})

每次创建新窗口时,ipcMain都订阅同一条消息。这意味着ipcMain收到'JSON_PAGE:Ready'消息时,它将调用已注册的每个回调,并将消息发送到每个窗口。


在这种情况下,最简单的解决方案是使用传递给ipcMain处理程序的事件将消息发送到将其发送到main的渲染器。其次,在createJSONWindow之外订阅一次:

ipcMain.on('JSON_PAGE:Ready', function(event, arg) {
      e.sender.send('JSON:Display', item);
});
function createJSONWindow() { ... }

但是,'JSON:Display'是否仅在页面加载后发送?如果是这样,您可以将窗口的webContent订阅到did-finish-load事件,该事件在页面加载后触发。

jsonWin.webContents.on("did-finish-load", () => {
    jsonWin.webContents.send(...);
});