运行此命令并单击“端口”子菜单项时,出现此错误,提示未定义mainWindow。这是为什么?您可以看到我在main.js文件中定义了它,那么为什么不在menu.js文件中注册它?
这里的最终目标是,当我单击菜单中的正确端口时,可以将该值发送到渲染器,以便可以使SerialPort连接到正确的串行端口。
Main.js
const { app, BrowserWindow} = require('electron')
const path = require('path')
const url = require('url')
let mainWindow
function createWindow() {
mainWindow = new BrowserWindow({ width: 1200, height: 600 })
mainWindow.loadURL(url.format({
pathname: path.join(__dirname, 'index.html'),
protocol: 'file:',
slashes: true
}))
mainWindow.webContents.openDevTools()
mainWindow.on('closed', function () {
mainWindow = null
})
require('./menu/menu')
}
app.on('ready', createWindow)
app.on('window-all-closed', function () {
app.quit()
})
app.on('activate', function () {
if (mainWindow === null) {
createWindow()
}
})
Menu.js
const { Menu, ipcMain, webContents } = require('electron')
const electron = require('electron')
const app = electron.app
const template = [
{
label: 'Edit',
submenu: [
{ role: 'undo' },
{ role: 'redo' }
]
},
{
label: 'Ports',
submenu: [
{
label: 'select port',
submenu: []
}
]
},
{ label: 'Help' }
]
if (process.platform === 'darwin') {
template.unshift({
label: app.getName(),
submenu: [
{ role: 'about' },
{ type: 'separator' },
{ role: 'services' },
{ type: 'separator' },
{ role: 'hide' },
{ role: 'hideothers' },
{ role: 'unhide' },
{ type: 'separator' },
{ role: 'quit' }
]
})
}
ipcMain.on('serialPorts', (event, data) => {
let portsSubMenu = []
data.forEach((port) => {
portsSubMenu.push({
label: port.comName,
click(menuItem, browserWindow, event) {
mainWindow.webContents.send('portSelected', port)
}
})
})
template[2].submenu[0].submenu = portsSubMenu
const menu = Menu.buildFromTemplate(template)
Menu.setApplicationMenu(menu)
})
答案 0 :(得分:0)
每个文件都是一个单独的模块,具有单独的上下文。您在一个模块中定义的每个变量,都将留在该模块中,并且永远不会泄漏到外部(除非您明确地做到了)。如果要从另一个模块的一个模块访问变量,则需要导出该变量或将其作为参数传递给另一个模块的相应方法。
该操作不成功,因为您正尝试从mainWindow
访问menu.js
,并且,如错误所述,您尚未在其中定义它。