#javascript #node.js #electron
#javascript #node.js #electron
Вопрос:
У меня есть приложение electron с 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,600,'#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,600,800,600,'#323233','./assets/logos/logo.png','./html/preferences.html')
}
if (request.func == 'close'){
mainWindow.closeWin()
}
if (request.func == 'min'){
mainWindow.minimizeWin()
}
}
if (request.window == 'app' amp;amp; request.func == 'exit' amp;amp; 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:UserscomputronicssourcereposDC-Model-Railway-Controllersourcedesktop
clientmain,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
Любая помощь будет высоко оценена
Ответ №1:
app.on('ready', () => {
let mainWindow = new GUI(800,600,800,600,'#323233','./assets/logos/logo.png', 'index.html')
})
Вы определяете переменную mainWindow
внутри функции анонимного прослушивателя.
Попробуйте сделать переменную глобальной, вот так:
var mainWindow;
app.on('ready', () => {
mainWindow = new GUI(800,600,800,600,'#323233','./assets/logos/logo.png', 'index.html')
})
другое возможное решение:
if (request.window == 'mainWindow'){
if (request.func == 'openPreferences') {
let preferencesWindow = new GUI(800,600,800,600,'#323233','./assets/logos/logo.png','./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,600,800,600,'#323233','./assets/logos/logo.png','./html/preferences.html')
}
if (request.func == 'close'){
request.window.closeWin()
}
if (request.func == 'min'){
request.window.minimizeWin()
}
}
Комментарии:
1. Спасибо за вашу помощь. Ваше первое предложение сработало.