我有一个main.js
文件和一个add.js
,当我点击main.js
菜单中的按钮时,第二个文件被调用如下:
const mainMenuTemplate = [
{
label: 'File',
submenu: [
{
label: 'Add',
click(){ //Calling add.js and the function createAddWindow()
let add = require( __dirname + '/add.js'); add.createAddWindow(); }
}
]
}
]
(这是实际菜单的简化版,但其余部分并不重要)
现在,在add.js
中我调用了一个使用输入的html,这个输入会像这样发送到main.js
<script>
const electron = require('electron');
const {ipcRenderer} = electron;
const form = document.querySelector('form');
form.addEventListener('submit', submitForm);
function submitForm(event){
event.preventDefault();
const item = document.querySelector('#item').value;
ipcRenderer.send('item:add',item);
}
</script>
问题在于,当我&#34;听到&#34; main.js
中的那个事件我想关闭“添加”。窗口,但我不能这样做
ipcMain.on('item:add',function(event, item){
console.log(item);
mainWindow.webContents.send('item:add',item);
add.close();
});
因为这里没有定义add
。我怎么能这样做?。
我知道我可以将两个文件合并为一个,但这是一个更好的做法而且我做错了吗?
提前致谢。我知道这是一个很长的问题,但我只是希望尽可能清楚。
答案 0 :(得分:0)
以下是一些想法
1)跟踪主要过程中新添加的窗口。
const ADD_WINDOW_ID = 'ADD_WINDOW'
const windows = {}
// make the window
windows[ADD_WINDOW_ID] = new BrowserWidnow() // ...
在主进程的close:add
IPC事件中,关闭添加窗口:
if (windows[ADD_WINDOW_ID]) {
windows[ADD_WINDOW_ID].close()
}
2)使用webContents
api获取此电子应用的所有网页内容
这不是一个完整的解决方案,也许是调查
每个窗口都有一个唯一标识的webContents,从添加窗口中查找当前Web内容的id,并将其传递给IPC回调:
// add window
import { remote } from 'electron'
const { id } = remote.getCurrentWebContents()
在主要过程中
import { webContents } from 'electron'
// on the IPC callback, identify which web contents
const allWebContents = webContents.getAllWebContents()
// todo: find the web contents with the right id, close the window
答案 1 :(得分:0)
如果将子窗口设置为子窗口,请尝试以下操作:将父窗口设置为const,并在该窗口上使用getChildWindows()方法,并在子窗口中记录日志。您会看到子窗口上没有“关闭”方法。使用“隐藏”方法确实有效。