Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 将数据从渲染进程发送到Electron中的渲染进程_Javascript_Node.js_Electron - Fatal编程技术网

Javascript 将数据从渲染进程发送到Electron中的渲染进程

Javascript 将数据从渲染进程发送到Electron中的渲染进程,javascript,node.js,electron,Javascript,Node.js,Electron,我正在使用Electron开发桌面应用程序, 场景是我有两个BrowserWindow,从第一个BrowserWindow,我将在点击按钮后转到第二个BrowserWindow。我已在FirstBrwoserWindow的按钮单击上实例化了SecondBrowserWindow,以避免对象被销毁异常。 根据Electron的说法,如果我们想在进程之间发送数据,就必须使用IPC。所以实际问题从这里开始,我在FirstBrwoserWindow的渲染器文件中创建SecondBrowserWindow

我正在使用Electron开发桌面应用程序, 场景是我有两个BrowserWindow,从第一个BrowserWindow,我将在点击按钮后转到第二个BrowserWindow。我已在FirstBrwoserWindow的按钮单击上实例化了SecondBrowserWindow,以避免对象被销毁异常。
根据Electron的说法,如果我们想在进程之间发送数据,就必须使用IPC。所以实际问题从这里开始,我在FirstBrwoserWindow的渲染器文件中创建SecondBrowserWindow对象,对于IPC,我需要在主进程中获取SecondBrowserWindow对象


如何在main.js中获取SecondBrowserWindow对象并在其中使用IPC.on???

我解决这一问题的方法是使用ipcRenderer将数据从第一个窗口传递到主进程,然后使用
BrowserWindow.webContents.send()将数据通过ipcMain传递到第二个窗口

看起来有点像这样

窗口1

...
// Emit an ipc message with your data
ipcRenderer('your-message', { foo: 'bar' });
...
主流程

...
let window1 = new BrowserWindow(...);
let window2 = new BrowserWindow(...);
...
// when ipc message received pass it on to second window object with webContents
ipcMain.on('your-message', (event, payload) => {
  window2.webContents.send('your-relayed-message', payload);
});
...
窗口2

...
// when ipc messaged received in second window do what you want with the data
ipcRenderer.on('your-relayed-message', (event, payload) => {
  console.log(payload);
});
...

你可以用更多的方法来做,但我建议你:

1) 当您收到在渲染器中打开第二个浏览器窗口的输入时,向main.js发送消息

2) 从main.js打开第二个浏览器窗口,这样您就可以控制它并以更干净的方式向它发送消息


通过这种方式,您可以关闭上一个BrowserWindow,而不会出现通信错误,对于N个BrowserWindow,您有一个更具可伸缩性和可读性的逻辑。

您的方法是常规方法,即在主进程中实例化两个窗口时使用的方法,在我的场景中,我将在第一个窗口的渲染器进程中实例化第二个窗口。是的,但是为了让两个窗口相互通信,您必须通过主进程中继消息。渲染进程彼此不可见。问题是我没有在main.js中实例化第二个BrowserWindow,所以我无法让它的对象将消息发送到第二个窗口。正如我所说,您必须从main.js实例化第二个BrowserWindow。你怎么能做到?与从第一个浏览器窗口打开第二个浏览器窗口(BW)不同,您必须从第一个浏览器窗口通过IPC向main.js发送消息,然后从main.js打开第二个浏览器窗口。我之前已经这样做了,但问题是,当我使用“关闭”菜单按钮关闭该窗口并再次尝试打开它时,我得到的对象已被销毁。为了克服此异常,我从firstBrowserWindow的按钮单击初始化了第二个browserwindow。您不能重新打开同一个BW对象。您必须实例化另一个对象,并且不会抛出异常。从某种意义上讲,重新打开,每次查看此解决方案时都会创建新对象