一个渲染器 process/main window 的多个 js 文件中的 ipcRenderer 侦听器未被调用
ipcRenderer listeners in multiple js files for one renderer process/main window not being called
使用纯 js 构建电子应用程序。我有一个 mainWindow 和一个 webContents(用 webContents.getAllWebContents() 检查)。在主要 window 中,我有两个不同的文件,一个是从一开始就加载的 (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 文件,以及其中需要多个 electron 是不是一个问题?
我找到了问题的解决方案:
首先,在 mainWindow.js
中,我在全局范围内使用 var:
声明了 electron
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);
};
这最终调用了 customerList.js
中的事件,并在 mainWindow 中记录了正确的客户对象。
使用纯 js 构建电子应用程序。我有一个 mainWindow 和一个 webContents(用 webContents.getAllWebContents() 检查)。在主要 window 中,我有两个不同的文件,一个是从一开始就加载的 (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 文件,以及其中需要多个 electron 是不是一个问题?
我找到了问题的解决方案:
首先,在 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);
};
这最终调用了 customerList.js
中的事件,并在 mainWindow 中记录了正确的客户对象。