Electron: Comment afficher la boîte de dialogue de confirmation avant le déchargement ?

Créé le 22 juil. 2015  ·  3Commentaires  ·  Source: electron/electron

L'événement beforeunload dans Electron agit différemment que dans le navigateur. Si je renvoie une chaîne, elle ne s'affiche pas dans une boîte de dialogue de confirmation. J'ai vu que dans BrowserWindow vous donnez un exemple d'utilisation de beforeunload et que vous y mentionnez dans un commentaire qu'il est possible d'afficher une boîte de dialogue de confirmation :

// Vous pouvez également utiliser l'API de dialogue pour laisser l'utilisateur confirmer la fermeture de l'application

L'API de dialogue n'est-elle pas disponible uniquement pour le processus principal ?
Quel est le moyen le plus simple de reproduire le comportement normal du navigateur ?

Commentaire le plus utile

@shneorasa Je sais que cela fait quelques mois que vous avez demandé (et vous avez probablement déjà trouvé une solution), mais pour ceux qui recherchent une solution à l'avenir, voici une meilleure façon de gérer ce problème par opposition à l'utilisation de window.onbeforeload .

L'écrasement beforeunload événement

// Inside main/index.js
import { app, BrowserWindow, dialog } from 'electron'
app.showExitPrompt = true

Avec cela, vous pouvez interrompre l'événement close de votre BrowserWindow comme suit :

// Inside main/index.js, where BrowserWindow is initialized
mainWindow.on('close', (e) => {
    if (app.showExitPrompt) {
        e.preventDefault() // Prevents the window from closing 
        dialog.showMessageBox({
            type: 'question',
            buttons: ['Yes', 'No'],
            title: 'Confirm',
            message: 'Unsaved data will be lost. Are you sure you want to quit?'
        }, function (response) {
            if (response === 0) { // Runs the following if 'Yes' is clicked
                app.showExitPrompt = false
                mainWindow.close()
            }
        })
    }
})

J'ai implémenté cette solution dans une application Electron à l'aide de Vue.js, et afficher/masquer la boîte de dialogue est aussi simple que d'importer app :

const { app } = require('electron').remote

et en écrasant la valeur booléenne stockée :

app.showExitPrompt = true

Tous les 3 commentaires

Peu importe. Je l'ai compris.

Pour référence future, voici un exemple :

window.onbeforeunload = function(e) {
    var remote = require('remote');
    var dialog = remote.require('dialog');
    var choice = dialog.showMessageBox(
            remote.getCurrentWindow(),
            {
                type: 'question',
                buttons: ['Yes', 'No'],
                title: 'Confirm',
                message: 'Are you sure you want to quit?'
            });

    return choice === 0;
};

salut(:
la solution indiquée ci-dessus ne fonctionne pas pour moi.
car il faut quand même le "onbeforeunload" du navigateur...
une idée?

@shneorasa Je sais que cela fait quelques mois que vous avez demandé (et vous avez probablement déjà trouvé une solution), mais pour ceux qui recherchent une solution à l'avenir, voici une meilleure façon de gérer ce problème par opposition à l'utilisation de window.onbeforeload .

L'écrasement beforeunload événement

// Inside main/index.js
import { app, BrowserWindow, dialog } from 'electron'
app.showExitPrompt = true

Avec cela, vous pouvez interrompre l'événement close de votre BrowserWindow comme suit :

// Inside main/index.js, where BrowserWindow is initialized
mainWindow.on('close', (e) => {
    if (app.showExitPrompt) {
        e.preventDefault() // Prevents the window from closing 
        dialog.showMessageBox({
            type: 'question',
            buttons: ['Yes', 'No'],
            title: 'Confirm',
            message: 'Unsaved data will be lost. Are you sure you want to quit?'
        }, function (response) {
            if (response === 0) { // Runs the following if 'Yes' is clicked
                app.showExitPrompt = false
                mainWindow.close()
            }
        })
    }
})

J'ai implémenté cette solution dans une application Electron à l'aide de Vue.js, et afficher/masquer la boîte de dialogue est aussi simple que d'importer app :

const { app } = require('electron').remote

et en écrasant la valeur booléenne stockée :

app.showExitPrompt = true
Cette page vous a été utile?
0 / 5 - 0 notes