web-dev-qa-db-fra.com

Exiger un dialogue électronique à partir du processus de rendu n'est pas défini

J'utilise electron et j'essaie d'ouvrir un navigateur de fichiers lorsqu'un utilisateur clique sur le bouton. Depuis le processus de rendu, j'essaye d'inclure le paquet elctron.dialog comme ceci.

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

console.log( dialog );

Cependant, le résultat du journal de la console est undefined

Je suis absolument sûr que je suis dans le processus de rendu donc je ne suis pas sûr de savoir pourquoi cela ne fonctionne pas. La documentation suggère que c'est la bonne façon de faire les choses mais que cela ne semble pas fonctionner. 

Ceci est mon fichier package.json 

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

Ceci est mon fichier 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();
        }
    );

c'est le fichier de processus rendu 

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

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

    console.log( dialog );

C'est la console 

Est-ce incorrect?

10
Edgar Martinez

Après quelques heures de réflexion, quelqu'un d'autre m'a fait remarquer que la "nouvelle" méthode (le 15/04/16) de procéder est la suivante. 

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

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

Vous devez exiger remote et ensuite à partir de dialoguer avec besoin. Il semble que vous n'avez plus besoin d'exiger electron 

2
Edgar Martinez

Sur le processus de rendu, vous devez utiliser le module Remote.

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

Plus d'informations:
API Electron Dialog
API Electron Remote

21
Philip

Electron dans la version la plus récente a changé la manière d’exiger les modules. Les modules sont encapsulés dans l'espace de noms d'électrons.

// 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;

Vous pouvez aussi utiliser cette syntaxe pour importer plusieurs modules avec moins d'écriture et en les rassemblant tous ensemble:

var {remote, ipcRenderer, someOtherModulFromElectron} = electron;

par exemple, dans le main.js (processus principal), nous pourrions écrire un tel appel:

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

au lieu de :

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
3
Mohamed Allal

Ce code fonctionne dans le script du fichier html:

const remote = require('electron').remote 

const dialog = remote.dialog;

dialog.showErrorBox('Error title', 'error')
1
D.Richard

Vous pouvez directement le récupérer à l'aide de la syntaxe suivante:

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

Et vous pouvez ensuite appeler les méthodes de dialogue requises comme ci-dessous:

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