0
votes

ShowOpenDialog ne fonctionne pas sur les versions récentes de electron-js

Je suis nouveau sur electronjs et je développe une petite application qui lit un fichier json et construit un petit formulaire html et renvoie les valeurs saisies par l'utilisateur. J'ai donc développé de petits scripts en javascript qui lient vers des balises html 'button' pour appeler des boîtes de dialogue afin qu'un utilisateur puisse entrer des répertoires, des fichiers et enregistrer le formulaire final. Tout fonctionne bien ... sur electronjs "^ 3.1.13". Mais si je mets à jour vers une version récente de la lib ("^ 8.2.5"), alors tout mon ShowOpenDialog sympa ne fonctionne pas du tout. Une idée de ce qui se passe? Voici le script pour ouvrir un dossier si cela vous aide:

{
 let myName = document.currentScript.getAttribute('name');
 const ipc       = require('electron').ipcRenderer;

 let  asyncBtn  = document.querySelector('#folder-selector-'+myName);
 let replyField = document.querySelector('#folder-selector-content-'+myName);
 let onButtonClick = function() {
     const { dialog } = require('electron').remote;
     let dialogOptions = {
       title: "Choisir un dossier:",
       properties: ['openDirectory','promptToCreate'],
     };
     dialog.showOpenDialog(
         dialogOptions,
         fileNames => {
           if (fileNames === undefined) {
             console.log("No file selected");
           } else {
             console.log('file:', fileNames[0]);
             replyField.value = fileNames[0];
           }
     })
 };

 asyncBtn.addEventListener("click", onButtonClick);

}

Merci beaucoup pour toute aide.


0 commentaires

4 Réponses :


1
votes

La version récente de showOpenDialog reçoit deux arguments: facultatif BrowserWindow, et des options comme deuxième argument. Il renvoie la promesse et ne nécessite pas de rappel. https://github.com/ electron / electron / blob / 8-xy / docs / api / dialog.md # dialogshowopendialogbrowserwindow-options

Vous devez donc changer votre logique de rappel en promesses.

let onButtonClick = function() {
     const { dialog } = require('electron').remote;
     let dialogOptions = {
       title: "Choisir un dossier:",
       properties: ['openDirectory','promptToCreate'],
     };
     dialog.showOpenDialog(
         dialogOptions
     ).then((fileNames)=>{
           if (fileNames === undefined) {
             console.log("No file selected");
           } else {
             console.log('file:', fileNames[0]);
             replyField.value = fileNames[0];
           }
     }).catch(err=>console.log('Handle Error',err))


 };

 asyncBtn.addEventListener("click", onButtonClick);


0 commentaires

1
votes

merci beaucoup Vladimir. J'ai donc essayé de mettre à jour mon code comme expliqué, de mettre à jour le package electron vers la version 8.2.5 et de modifier le script comme vous l'avez expliqué, mais cela ne va pas mieux. Si je l'ai bien compris, ce code devrait être correct, mais ne fonctionne pas sur l'électron 8.2.5. Une erreur que vous voyez toujours à ce sujet?

 {
 let myName = document.currentScript.getAttribute('name');
 const ipc       = require('electron').ipcRenderer;

 let  asyncBtn  = document.querySelector('#folder-selector-'+myName);
 let replyField = document.querySelector('#folder-selector-content-'+myName);
 let onButtonClick = function() {
     const { dialog } = require('electron').remote;

     let dialogOptions = {
       title: "Choisir un dossier:",
       properties: ['openDirectory','promptToCreate']
     };
     dialog.showOpenDialog( dialog.getCurrentWindow(), dialogOptions).then(result => {
     if(!result.canceled) {
          replyField.value = result.filePaths[0];
      }
     }).catch(err => {
       console.log(err)
     })
 };
 asyncBtn.addEventListener("click", onButtonClick);
 }


0 commentaires

2
votes

Outre le fait que l'appel à dialog.showOpenDialog a en effet été mis à jour dans les versions récentes d'Electron, et renvoie une promesse au lieu d'utiliser une fonction de rappel, il y a une autre faille dans votre code mis à jour: la lecture de la page de documentation mentionnée ci-dessus montre que getCurrentWindow () code > n'est pas une méthode de dialog ; il peut être obtenu à partir de remote à la place, vous devez donc l'ajouter explicitement:

 dialog.showOpenDialog( getCurrentWindow(), dialogOptions).then(result => {

puis l'appeler simplement de l'intérieur de dialog.showOpenDialog :

 const { dialog, getCurrentWindow } = require('electron').remote;

mais c'est une erreur que vous auriez pu vous-même attraper en regardant la console de DevTools, qui afficherait:

TypeError: dialog.getCurrentWindow n'est pas une fonction


1 commentaires

OK merci. Je pense que j'ai besoin d'utiliser un environnement de développement approprié pour mon code javascript maintenant. J'étais en train d'éditer sur Xcode car je suis beaucoup plus habitué à développer en C ++. Je vérifie ces devtools et j'essaye de ne plus déranger la communauté!



0
votes

Ok, enfin compris. En dehors de l'aide la plus appréciée que j'ai eue, j'ai manqué "webPreferences": { nodeIntegration: vrai } dans le main.js pour le faire fonctionner. La découverte des outils de développement a également été d'une grande aide :)

Maintenant, tout va bien à nouveau. Merci beaucoup!


1 commentaires

Veuillez utiliser l'option de modification sur votre autre réponse pour ajouter des informations supplémentaires. Veuillez également ne pas poster "Merci", mais juste la réponse réelle.