电子,关闭"子窗口"从主窗口

时间:2018-06-01 20:12:38

标签: node.js electron

我有一个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。我怎么能这样做?。

我知道我可以将两个文件合并为一个,但这是一个更好的做法而且我做错了吗?

提前致谢。我知道这是一个很长的问题,但我只是希望尽可能清楚。

2 个答案:

答案 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()方法,并在子窗口中记录日志。您会看到子窗口上没有“关闭”方法。使用“隐藏”方法确实有效。