从电子主菜单访问渲染器脚本

时间:2017-06-15 19:19:43

标签: electron

我需要通过onclick从电子主菜单访问渲染器脚本。我已将以下内容添加到电子主菜单中:

{
       label: 'Checking for Update',
       click: function () {
          require('./update')
       }
}

.........................

{
       label: `Preferences...`,
       click: function () { 
          require('./preferences')
       }
}

我尝试拨打上面的preferences.jsupdate.js。从index.html直接调用,或通过onclick从应用程序窗口调用时,两个脚本都运行正常,但不是从应用程序菜单调用。在主应用程序菜单中单击时,它只是错误

Uncaught Exception:
TypeError: Cannot read property 'app' of undefined
    at IncomingMessage.res.on (update.js:20:36)
    at emitOne (events.js:96:13)
    at IncomingMessage.emit (events.js:188:7)
    at IncomingMessage.Readable.read (_stream_readable.js:381:10)
    at flow (_stream_readable.js:761:34)
    at resume_ (_stream_readable.js:743:3)
    at _combinedTickCallback (internal/process/next_tick.js:74:11)
    at process._tickCallback (internal/process/next_tick.js:98:9)

update.js:20如下所示:

   const appname = electron.remote.app.getName()

主菜单过程中没有遥控器。远程模块只属于渲染器,所以这对我来说似乎是合理的错误。

但是我不太确定如何轻松解决这个问题,并且一旦从应用菜单调用脚本就可以使脚本正常工作。

2 个答案:

答案 0 :(得分:0)

这样的事情可行:

const {app} = (process.type === 'renderer' ? require('electron').remote : require('electron'))

我认为这应该有助于使您的代码成为主要和渲染器证明。当然,您必须相应地更改其余代码。 const appname = electron.remote.app.getName()只会成为const appname = app.getName()

答案 1 :(得分:0)

我能够解决它如下:

const electron = require('electron')
const remote = electron.remote       
if (remote) {    // remote will be 'undefined' when calling from the main process              
   const app = remote.app
   const dialog = remote.dialog 
   const window = remote.getCurrentWindow()
} else {
   const app = electron.app
   const dialog = electron.dialog 
   const window = electron.getCurrentWindow()
}