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

时间:2016-11-01 08:31:05

标签: node.js electron

我正在构建一个电子应用,其中SUBMIT对象是在快速启动后创建的:http://electron.atom.io/docs/tutorial/quick-start/

按照这个快速入门,它是异步创建的。我遇到的问题是,例如当我想从main向渲染器进程发送消息时,我需要引用mainWindow对象。如果这恰好出现在我需要的模块中,那么我需要一种方法让这个模块知道mainWindow对象。

我当然可以用mainWindow作为前缀,但我知道这是非常建议的。所以我希望更优雅。

我发现了这篇文章:Asynchronous nodejs module exports;这似乎提供了一个解决方案。从快速入门获取global.文件(参见上面的链接,它已明确显示在那里),看来我会添加到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

虽然原帖中的简单情况'异步nodejs模块导出'工作正常,我不能像上面描述的那样工作;运行它抱怨的应用module.exports.doSomething = function(window) { // Do something with window object, like sending ipc messages to it window.webContents.send('hello-from-main', "hi!"); } 。如果我直接Uncaught Exception: TypeError: Cannot read property 'webContents' of null的回调中需要lib.js(我知道也建议不要这样做),情况也是如此。

我承认我并不完全理解帖子的简单情况,因为我对节点很新。这使我无法修复自己的实现,我同意这是合理地应该预期失败的直接复制/粘贴。有人可以帮助我纠正上面的方法,或者告诉我一个不同的方法来使它工作吗?谢谢!

2 个答案:

答案 0 :(得分:1)

Whooops!魔鬼在细节......我已经在main.js

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

导致错误!应该是

let mainWindow, callback;

然后它完美无缺!

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

答案 1 :(得分:0)

我已经为此创建了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 ES2015 way
const mainWindow = require('electron-main-window').getMainWindow();

// e.g:
if(mainWindow !== null ){
  mainWindow.webContents.send('mainWindowCommunication', "This is a test message");
}