我正在写我的第一个电子应用程序,所以请宽容:)
当用户按下主窗口上的按钮时,应该打开一个显示一些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
,不是吗?
谢谢。
答案 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(...);
});