如何解决电子IPCMain无法访问变量 另一种可能的解决方案:
我有一个电子应用程序,其main.js文件以更oo的风格编写。当我从渲染过程中发送请求时,它就很好了。问题在于,当它尝试为对象调用方法时,会指出该对象未定义。
const { app,BrowserWindow,Menu,shell,dialog,session,ipcMain,webContents } = require('electron')
class GUI extends BrowserWindow {
/**
* Generates a window
* @param {number} width - The initial width of the window. Default 800
* @param {number} height - The initial height of the window. Default 600
* @param {number} minWidth - The minimum width the window can possibly be. Default 800
* @param {number} minHeight - The minimum height the window can possibly be. Default 600
* @param {string} backgroundColor - The background colour of the window. Default #FFF
* @param {string} icon - The path to the icon. Default null
* @param {string} indexFile - The path to the index file to be loaded. Default null
* @param {Electron.Menu} menu - The menu that should be displayed. Default null
*/
constructor(width = 800,height = 600,minWidth = 800,minHeight = 600,backgroundColor = '#FFF',icon = null,indexFile = null,menu = null){
super({
width: width,height: height,minWidth: minWidth,minHeight: minHeight,icon: icon,backgroundColor: backgroundColor,frame: false,webPreferences: {
nodeIntegration: true,enableRemoteModule: true
}
})
this.fullscreen = false
this.loadFile(indexFile)
this.webContents.openDevTools()
Menu.setApplicationMenu(menu)
}//Constructor
closeWin(){
if(this.webContents.isDevToolsOpened == true){
this.webContents.closeDevTools()
}
this.close()
}//Close
minimizeWin(){
this.minimize()
}
}
//Called when electron has finished initialising
app.on('ready',() => {
let mainWindow = new GUI(800,600,800,'#323233','./assets/logos/logo.png','index.html')
})
//Quit when all windows are closed except on macOS
app.on('window-all-closed',() => {
if (process.platform !== 'darwin'){
app.quit()
}
})
ipcMain.on('windowControl',(event,arg) => {
console.log(arg)
// var request = JSON.parse(arg)
var request = arg
console.log(request)
console.log(request.window)
if (request.window == 'mainWindow'){
if (request.func == 'openPreferences') {
let preferencesWindow = new GUI(800,'./html/preferences.html')
}
if (request.func == 'close'){
mainWindow.closeWin()
}
if (request.func == 'min'){
mainWindow.minimizeWin()
}
}
if (request.window == 'app' && request.func == 'exit' && process.platform !== 'darwin'){
app.quit()
}
})
单击关闭按钮时出现的错误:
A JavaScript error occurred in the main process
Uncaught Exception: iN
ReferenceError: mainWindow is not defined
at IpcMainImpl.<anonymous>
(C:\Users\computronics\source\repos\DC-Model-Railway-Controller\source\desktop
client\main,js:111:13)
at IpcMainImpl.emit (events.js:223:5)
at WebContents.< anonymous> (electron/js2c/browser_init.js:173:8161)
at WebContents.emit (events.js:223:5)
我的目的是将请求从渲染过程发送到主过程,并执行这些请求。这些请求包括创建和关闭窗口。最小化窗口和其他请求。
渲染过程中发送的示例消息:
{window:'mainWindow',func:'close'}
其他信息
Nodejs: 12.14.1
Chrome: 83.0.4103.122
Electron: 9,1.2
V8: 8,3.110,13-electron.0
OS: Windows_NT x64 10,.0.18362
任何帮助将不胜感激
解决方法
app.on('ready',() => {
let mainWindow = new GUI(800,600,800,'#323233','./assets/logos/logo.png','index.html')
})
您正在匿名侦听器函数中定义变量mainWindow
。
尝试将变量设置为全局变量,如下所示:
var mainWindow;
app.on('ready',() => {
mainWindow = new GUI(800,'index.html')
})
另一种可能的解决方案:
if (request.window == 'mainWindow'){
if (request.func == 'openPreferences') {
let preferencesWindow = new GUI(800,'./html/preferences.html')
}
if (request.func == 'close'){
mainWindow.closeWin()
}
if (request.func == 'min'){
mainWindow.minimizeWin()
}
}
将mainWindow
替换为request.window
if (request.window == 'mainWindow'){
if (request.func == 'openPreferences') {
let preferencesWindow = new GUI(800,'./html/preferences.html')
}
if (request.func == 'close'){
request.window.closeWin()
}
if (request.func == 'min'){
request.window.minimizeWin()
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。