Вопрос:

В электронном меню постоянно говорится, что ipc не определяется при нажатии, даже когда ipc назначен глобально в главном

javascript menu electron ipc

745 просмотра

2 ответа

19 Репутация автора

в моем menu.js в разделе «label: 'Database'» событие click возвращает ошибку: ipc не определен. Я подумал, что если это часть файлов main.js и если у меня уже есть const, объявленный как ipc глобально, то не должен ли JS посмотреть выше и найти ipc?

main.js:

const electron = require('electron'),
{app, Menu} = require('electron'),      
Window = electron.BrowserWindow,      
path = require('path'),   
url = require('url'),      
ipc = require('electron').ipcMain,   // COMMUNICATIONS MODULE BETWEEN MAIN/RENDERER      
template = require('./menu.js');      

// let mainWindow
app.on('ready', () => {    
  // LOADS THE DEFAULT WINDOW
  let first_Window = new Window({width:800, height:600, frame:false}) 
  first_Window.loadURL(url.format({
    pathname: path.join(__dirname, 'index.html'),
    protocol: 'file:'
  }))    
  const menu = Menu.buildFromTemplate(template)
  Menu.setApplicationMenu(menu)       
})

Menu.js:

module.exports = [ 
  {
    label: 'stuff',
    submenu: [
      {role: 'undo'},
      {role: 'redo'},
      {type: 'separator'},
      {role: 'cut'},
      {role: 'copy'},
      {role: 'paste'},
      {role: 'pasteandmatchstyle'},
      {role: 'delete'},
      {role: 'selectall'}
    ]
  },
  {
    label: 'Database',
    click() {
       ipc.send('open_database', '')
    }
  },
  {
    label: 'View',
    submenu: [
      {role: 'reload'},
      {role: 'forcereload'},
      {role: 'toggledevtools'},
      {type: 'separator'},
      {role: 'resetzoom'},
      {role: 'zoomin'},
      {role: 'zoomout'},
      {type: 'separator'},
      {role: 'togglefullscreen'}
    ]
  },
  {
    role: 'window',
    submenu: [
      {role: 'minimize'},
      {role: 'close'}
    ]
  },
  {
    role: 'help',
    submenu: [
      {
        label: 'Learn More',
        click () { require('electron').shell.openExternal('https://electron.atom.io') }
      }
    ]
  }
]

Примечание. Мое меню отображается очень хорошо. Ошибка возникает только при нажатии на базу данных.

Автор: Lifeislifebutwhatiswhat Источник Размещён: 08.11.2017 10:41

Ответы (2)


1 плюс

1255 Репутация автора

Вам не нужно ipcв menu.js для этого. Это уже работает тот же процесс. Я бы предложил использовать webcontentsвместо этого.

В вашем menu.jsимпорте BrowserWindow и измените clickфункцию вDatabase

const { BrowserWindow } = require('electron');

label: 'Database',
click: () => {
  const focusedWindow = BrowserWindow.getFocusedWindow();
  focusedWindow.webContents.send('open-database');
}

Затем в вашем main.jsдобавить слушателя для databaseсообщения и открыть новыйBrowserWindow

ipcMain.on('open-database', () => {
  // open new BrowserWindow

});
Автор: kemotoe Размещён: 09.11.2017 08:04

0 плюса

2918 Репутация автора

Поскольку Menuэто основной класс процесса, вам не нужно использовать ipc-коммуникацию для таких вещей, как открытие нового BrowserWindow(что вы, очевидно, хотите).

const {BrowserWindow} = require('electron')

module.exports = [
  {
    label: 'Database',
    click (menuItem, browserWindow, event) {
      let win = new BrowserWindow()
      win.loadURL('https://electron.atom.io/docs/api/menu-item/')
    }
  }
]

должно быть достаточно в вашем шаблоне для этого.

Обратите внимание, что если вы планируете взаимодействовать с процессом визуализации вашего окна, clickобратный вызов поставляется с browserWindowаргументом, предоставляющим вам доступ к окну, содержащему пункт меню (см. clickСвойство MenuItemв документации). Вы можете затем executeJavascriptили sendIPC сообщение для процесса визуализации, используя этот аргумент.

Также обратите внимание, что, несмотря на тот факт, что BrowserWindow(или ipcчто-то еще) уже определено в другом файле, который требует этот шаблон, вы должны определить его снова. Требовать / импортировать / включить цепочки не работает в двух направлениях

Автор: pergy Размещён: 14.11.2017 09:01
Вопросы из категории :
32x32