电子应用程序:在另一个模块中引用mainWindow对象?

问题描述 投票:2回答:2

我正在构建一个电子应用程序,其中在快速入门之后创建了mainWindow对象:http://electron.atom.io/docs/tutorial/quick-start/

根据此快速入门,它是异步创建的。我遇到的问题是,例如,当我要将消息从main发送到渲染器进程时,我需要引用mainWindow对象。如果恰好在我需要的模块中,则需要一种方法使该模块知道mainWindow对象。

我当然可以在global.之前加上它,但是我知道这是非常建议的。所以我希望做得更优雅。

我遇到了这篇文章:Asynchronous nodejs module exports;这似乎提供了解决方案。从快速入门中获取main.js文件(请参见上面的链接,该文件在此处明确显示),看来我将添加到createWindow函数中

if( typeof callback === 'function' ){
  callback(mainWindow);
}

并将main.js模块导出为

module.exports = function(cb){
  if(typeof mainWindow !== 'undefined'){
    cb(mainWindow); 
  } else {
    callback = cb;
  }
}

然后,在更高级别的脚本中,我要求如下:

let main = require('./main.js');
let lib = require('./lib.js');  // Library where I need a mainWindow reference
main(function(window) {
    lib.doSomething(window);
});

lib.js的外观

module.exports.doSomething = function(window) {
  // Do something with window object, like sending ipc messages to it
  window.webContents.send('hello-from-main', "hi!");
}

尽管原始文章“异步nodejs模块导出”中的简单情况可以正常工作,但我无法使它像上述那样工作;运行它抱怨的应用程序Uncaught Exception: TypeError: Cannot read property 'webContents' of null。如果我直接lib.js的回调中要求main()(我也建议不要这样做),也是这种情况。

我承认我不完全了解该帖子的简单情况,因为我对node还是很陌生。这使我无法修复自己的实现,我同意这是过分的复制/粘贴,应该合理地认为它会失败。有人可以帮助我纠正上述方法,还是建议我采用其他方法使其有效?谢谢!

node.js electron
2个回答
1
投票

哇!细节决定成败...我在main.js

上方定义了
let mainWindow = null, callback;

导致错误!应该是

let mainWindow, callback;

那么它就完美地工作了!

P.s。我没有删除我的帖子,而是选择保留它并回答自己,以供将来需要异步导出的其他人参考。


1
投票

我已经为它创建了npm软件包electron-main-window

安装:

$ npm install electron-main-window

or 

$ yarn add electron-main-window

用法:

// Import ES6 way
import { getMainWindow } from 'electron-main-window';
const mainWindow = getMainWindow();

// Import ES5 way
const mainWindow = require('electron-main-window').getMainWindow();

// e.g:
if(mainWindow !== null ){
  mainWindow.webContents.send('mainWindowCommunication', "This is a test message");
}
© www.soinside.com 2019 - 2024. All rights reserved.