Undefined template constant in Electron

时间:2016-07-11 21:06:53

标签: javascript electron

I'm in the process of finishing up my first app on Electron, i'm a Junior Web Developer, so please excuse me if it's a simple mistake or you spot something you think can be done better. But basically, I'm building a basic menu on macOS so I can have Copy / Paste functionality after packaging. Now i've followed the documentation from https://github.com/electron/electron/blob/master/docs/api/menu.md, made a few tweaks to fit my needs but seem to be having a problem when running, the error being:

    Uncaught Exception:
    TypeError: Cannot read property 'buildFromTemplate' of undefined
    at EventEmitter.createWindow (/Users/Jay/Desktop/click_palette_release/app/main.js:73:22)
    at emitOne (events.js:101:20)
    at EventEmitter.emit (events.js:188:7)

This to me would suggest that 'template' isn't defined? However I define it at the top on line 70 with const. What am I missing here? Been scratching my head at it for some time now.

const template = [
{
    label: 'Edit',
    submenu: [
      {
        role: 'copy'
      },
      {
        role: 'paste'
      },
    ]
}];
const menu = Menu.buildFromTemplate(template);
Menu.setApplicationMenu(menu);

Line 73 being const menu = Menu.buildFromTemplate(template);

Thanks in advance!

Full code:

const electron = require('electron');
const {app} = electron;
const {BrowserWindow} = electron;

const Configstore = require('configstore');
const pkg = require(__dirname + '/init.json');
const sysconf = new Configstore(pkg.name);

var Menu = require("electron").menu;
let mainWindow;

function createWindow(){
// This method will be called when Electron has finished
// initialization and is ready to create browser windows.

    if (sysconf.get('bounds')){
        var bounds = sysconf.get('bounds');
    } else {
        var bounds = {'x':'', 'y':'', 'width':'400', 'height':'125'}
    }

    // Create the browser window.
    mainWindow = new BrowserWindow({
        x: bounds.x,
        y: bounds.y,
        width: 400,
        height: 90,
        //'titleBarStyle': 'hidden',
        title: 'ClickPalette',
        backgroundColor: '#fff',
        frame: false
    });

    mainWindow.setResizable(false);
    mainWindow.setAlwaysOnTop(true);
    mainWindow.loadURL('file://' + __dirname + '/index.html');
    mainWindow.setMenu(null);

    //mainWindow.webContents.openDevTools();

    mainWindow.on('close', function(e) {
        var bounds = mainWindow.getBounds();
        sysconf.set({'bounds' : bounds});
    });

    // Emitted when the window is closed.
    mainWindow.on('closed', function() {
        mainWindow = null;
    });

    //Settings / Manager
    var manageWindow = new BrowserWindow({
        width: 400,
        height: 400,
        show: false
    });

    manageWindow.loadURL('file://' + __dirname + '/manage.html');
    //manageWindow.webContents.openDevTools();

    const template = [
    {
        label: 'Edit',
        submenu: [
          {
            role: 'copy'
          },
          {
            role: 'paste'
          },
        ]
    }];
    const menu = Menu.buildFromTemplate(template);
    Menu.setApplicationMenu(menu);

};

// Load mainWindow
app.on('ready', createWindow);

// Quit when all windows are closed.
app.on('window-all-closed', function () {
    if (process.platform !== 'darwin') {
        app.quit();
    }
});

//Show window
app.on('activate', function (e) {
    if (mainWindow === null) {
        createWindow();
    }
});

RESOLVED I was using const Menu = require('electron').menu; but the M in menu should have been uppercase: const Menu = require('electron').Menu;

0 个答案:

没有答案