【问题标题】:Electron - ipcRenderer not working in main.jsElectron - ipcRenderer 在 main.js 中不起作用
【发布时间】:2021-01-20 06:47:04
【问题描述】:

我就是想不通。如果我是正确的,通常你在主文件中使用“ipcMain”(在我的例子中是 main.js)。但是我使用冒号-ide,而 ipcMain 是在其他地方定义的。 我想创建一个新窗口。创建新窗口所需的一切都在 main.js 文件中,但信号在其他地方。所以我需要向 main.js 发送一个“create-window”信号。事实上,我是从定义了 ipcMain 的文件中发送的。

这就是问题所在: 在 main.js 中,我使用以下内容:

const ipc = require('electron').ipcRenderer;
ipc.on('someSignal', function (event, structure) {
     console.log("something");
});

我收到一个错误,即未定义的 ipc。

当我使用以下内容时:

const ipc = require('electron').ipcMain;
ipc.on('someSignal', function (event, structure) {
    console.log("something");
});

什么都没有发生。它不听,而且我相信我应该只有一个 ipcMain,所以这一定是错误的。

我做错了什么?如果您需要更多代码,请告诉我。

为了详细说明,让我告诉你这个: 我有一个 functions.js 文件,其中调用了事件。请忽略“结构”变量。

const ipc = require('electron').ipcMain;

function someFunction() {
    console.log("function is invoked");
    let structure = 0;
    mainWindow.webContents.send('someSignal', structure);
}

“someFunction”在某个时候被调用 - 我在控制台中收到“函数被调用”消息,所以这部分有效。

editor.js中定义了ipcRenderer,如果我把监听函数放在这里:

const ipc = require('electron').ipcRenderer;

ipc.on('someSignal', function (event, structure) {
    console.log("something");
});

它有效。 “某事”被打印出来。

但是,我需要在 ma​​in.js 文件中添加监听器,因为这是我创建新窗口的功能所在。但是侦听器在那里不起作用。如果我使用 ipcRenderer 它保持未定义,并且如果我执行 ipc.on 函数会引发错误。如果我使用 ipcMain 它会被定义(typeof 返回一个对象),所以看起来这就是我必须使用的。但是什么也没发生。

这是因为我试图在 2 个 ipcMain 之间发送消息吗?我可能会尝试使用全局函数作为解决方法。

【问题讨论】:

  • 你是如何调用事件的?您还应该显示用例,就像您当前显示的代码一样,您只定义一个侦听器而不发送触发它的事件。或者这正是你提出问题的方式?还有一小部分展示了如何在Electron's Quick Start Guide 上执行此操作的示例。
  • 我已经编辑了问题,请查看。我省略了我认为不相关的部分代码。如果您想要完整的代码,请告诉我。
  • 也许我应该重新表述这个问题。如果 ipcMain 位于与主文件不同的文件中,如何从渲染器访问主文件的功能?要么我对所有事情都非常误导,要么全局变量也不起作用。

标签: javascript electron


【解决方案1】:

要访问 BrowserWindow 中的require("electron") API,您需要在构造函数中启用nodeIntegration

var myWindow = new BrowserWindow({
  width:600,
  height:400,
  // --- below here ---
  webPreferences:{
    nodeIntegration:true
  }
  // --- above here ---
});

【讨论】:

  • 感谢您的回复。不幸的是,不是这样,我已经启用了 nodeIntegration。此外,如果我直接从 main.js 文件中调用它,创建新窗口也可以,但这不是我想要的。我已经编辑了我的问题,以删除不必要的信息,比如让我们甚至忘记我正在尝试打开一个新窗口。假设我只是想在控制台打印一些东西。
猜你喜欢
  • 2019-03-19
  • 2016-06-19
  • 2018-11-15
  • 1970-01-01
  • 2021-11-02
  • 1970-01-01
  • 2020-09-17
  • 2022-06-10
  • 2020-08-19
相关资源
最近更新 更多