从渲染过程中要求电子对话是未定义的

时间:2016-04-15 02:20:10

标签: javascript electron

我正在使用电子,并且在用户点击按钮时尝试打开文件浏览器。从渲染过程中,我试图像这样包含elctron.dialog包。

const dialog = require( 'electron' ).dialog;

console.log( dialog );

但是,控制台日志的结果是undefined

我绝对相信我处于渲染过程中,所以我不确定为什么这不起作用。文档表明这是正确的做事方式,但似乎无法正常工作。

这是我的package.json文件

{
  "name": "my-app",
  "version": "0.1.0",
  "main": "./main.js",
  "scripts": {
    "start": "electron ."
  },
  "dependencies": {
    "electron": "^0.4.1"
  }
}

这是我的main.js文件

    'use strict';

    var app = require( 'app' );
    var BrowserWindow = require( 'browser-window' );
    var ipc = require( 'ipc' );

    var mainWindow = null;

    app.on(
        'ready', function () {
            mainWindow = new BrowserWindow(
                {
                    frame : true,
                    height: 700,
                    width : 500
                }
            );

            mainWindow.loadUrl( 'file://' + __dirname + '/app/index.html' );

            mainWindow.openDevTools();
            mainWindow.on(
                'closed', function () {
                    mainWindow = null;
                }
            );

        }
    );

    ipc.on(
        'close-main-window', function () {
            app.quit();
        }
    );

这是渲染的流程文件

    // Add your index.js code in this file
    var ipc = require( 'ipc' );

    const dialog = require( 'electron' ).dialog;

    console.log( dialog );

这是控制台

这是不正确的?

6 个答案:

答案 0 :(得分:25)

在渲染器过程中,您必须使用远程模块。

const dialog = require('electron').remote.dialog 

更多信息:
Electron Dialog API
Electron Remote API

答案 1 :(得分:3)

最新版本的电子已经改变了需要模块的方式。这些模块封装在电子名称空间内。

// for getting the electrons modules here the new method now i'm using 1.7.12 Electron version (i don't know what that will be in the future)
// you require electron first! it's a name space (module)
var electron = require("electron");
var remote = electron.remote; // you get all the subModuls directly as property (cool incapsulation)
//remote = require("remote") ===> will not work!!!!

// for dialog it's the same !! but we now use remote as modul
var dialog = remote.dialog;

此外,您可以使用此语法,以较少的写入方式导入多个模块,并将它们全部收集在一起:

var {remote, ipcRenderer, someOtherModulFromElectron} = electron;

例如在main.js(主进程)中我们可以编写这样的调用:

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

取代:

const electron = require('electron')

// Module to control application life.
const app = electron.app

// Module to create native browser window.
const BrowserWindow = electron.BrowserWindow

//modul for bar menu
const Menu = electron.Menu

答案 2 :(得分:2)

经过几个小时的调查someone else向我指出,这样做的“新”方式(4/15/16)如下。

var remote = require('remote');
var dialog = remote.require('dialog');

dialog.showOpenDialog({ 
  properties: [ 'openFile' ] }, function ( filename ) {
    console.log( filename.toString() );
  }
);

您必须要求remote然后从远程需要对话框。您似乎不再需要electron

答案 3 :(得分:1)

此代码适用于html文件的脚本:

const remote = require('electron').remote 

const dialog = remote.dialog;

dialog.showErrorBox('Error title', 'error')

答案 4 :(得分:0)

您可以使用以下语法直接从电子中抓取它:

const electron = require('electron')
const {dialog} = electron;

然后您可以调用所需的对话框方法,如下所示:

dialog.showOpenDialog({ properties: ['openFile'] }, (filename) => {
  console.log(filename.toString());
});

答案 5 :(得分:0)

对我来说,这是因为我在package.json中使用的是node index.js而不是npm start

  "scripts": {
    "start": "electron index.js"
  },