电子JS主窗口未定义

时间:2019-03-04 02:01:54

标签: javascript electron

运行此命令并单击“端口”子菜单项时,出现此错误,提示未定义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)
})

1 个答案:

答案 0 :(得分:0)

每个文件都是一个单独的模块,具有单独的上下文。您在一个模块中定义的每个变量,都将留在该模块中,并且永远不会泄漏到外部(除非您明确地做到了)。如果要从另一个模块的一个模块访问变量,则需要导出该变量或将其作为参数传递给另一个模块的相应方法。

该操作不成功,因为您正尝试从mainWindow访问menu.js,并且,如错误所述,您尚未在其中定义它。