Слушатели ipcRenderer в нескольких js файлах для одного процесса визуализации / главного окна не вызывается - PullRequest
0 голосов
/ 09 марта 2020

Создание электронного приложения с простым js. Я получил одно mainWindow с одним webContents (проверено с помощью webContents.getAllWebContents ()). В главном окне у меня есть два разных файла, один загружается с самого начала (mainWindow.js) и другой, который загружается динамически (customerList.js).

Итак, из основного процесса, который я запускаю mainWindow.webContents.send('customer:display', customerObject);. Тогда в customerList.js у меня есть

const customerElectron = require('electron');

customerElectron.ipcRenderer.on('customer:display', (e, customer) => {
  console.log('customer: ', customer);
};

Это не называется. Чтобы проверить, вызывался ли он, я добавил то же самое к своему mainWindow.js:

const mainElectron = require('electron');

mainElectron.ipcRenderer.on('customer:display', (e, customer) => {
  console.log(customer, 'customer');
};

Это вызывается и регистрирует правильный объект клиента. Поскольку существует только один webContents, я бы предположил, что ipcRenderer просто добавляет к этому событие. Также я проверил, было ли добавлено событие, обернув слушателя в console.log(JSON.stringify(customerElectron.ipcRenderer)). До того, как слушатель был создан, у него было 0 событий, затем у него было 1 событие. Поэтому код для добавления прослушивателя определенно называется.

Поскольку сценарий js относится к динамически загружаемому содержимому и в настоящее время необходимо загружать его после загрузки содержимого в DOM, я не могу просто добавить прослушиватели в мой mainWindow.js. Есть ли решение этой проблемы? И вообще, является ли проблемой наличие нескольких файлов js для одного процесса рендеринга, а также нескольких электронов, требуемых в них?

1 Ответ

0 голосов
/ 09 марта 2020

Я нашел решение своей проблемы:

Прежде всего в mainWindow.js Я объявил электрон в глобальной области видимости с помощью var:

var electron = require('electron');

Это сделало его доступным в другом скрипт. Я также добавил событие onload в скрипт, чтобы дождаться загрузки скрипта. В mainWindow. js:

// loading dynamic content here
callback = _ => { ipcRenderer.send('content:added', '') };
// script contains the script node
script.onload = callback;

В customerList. js:

electron.ipcRenderer.on('customer:display', customer => {
  console.log('Customer: ', customer);
});

Затем в main. js:

// customerObject is a defined customerObject
ipcMain.on('content:added', _ => {
  mainWindow.webContents.send('customer:display', customerObject);
};

This наконец, вызывает событие в customerList.js и в mainWindow регистрируется нужный объект клиента.

...