Electron: рдкрд╣рд▓реЗ рд╕реЗ рд▓реЛрдб рд╣реЛрдиреЗ рдкрд░ рдкреБрд╖реНрдЯрд┐рдХрд░рдг рд╕рдВрд╡рд╛рдж рдХреИрд╕реЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдВ?

рдХреЛ рдирд┐рд░реНрдорд┐рдд 22 рдЬреБрд▓ре░ 2015  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: electron/electron

рдЗрд▓реЗрдХреНрдЯреНрд░реЙрди рдореЗрдВ beforeunload рдШрдЯрдирд╛, рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрд▓рдЧ рддрд░рд╣ рд╕реЗ рдХрд╛рд░реНрдп рдХрд░рддреА рд╣реИред рдЕрдЧрд░ рдореИрдВ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд▓реМрдЯрд╛рддрд╛ рд╣реВрдВ рддреЛ рдпрд╣ рдПрдХ рдкреБрд╖реНрдЯрд┐рдХрд░рдг рд╕рдВрд╡рд╛рдж рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред рдореИрдВрдиреЗ рджреЗрдЦрд╛ рдХрд┐ BrowserWindow рдЖрдк beforeunload рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреЗрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕рдореЗрдВ рдЖрдк рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдореЗрдВ рдЙрд▓реНрд▓реЗрдЦ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдПрдХ рдкреБрд╖реНрдЯрд┐рдХрд░рдг рд╕рдВрд╡рд╛рдж рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ:

// рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдмрдВрдж рдХрд░рдиреЗ рдХреА рдкреБрд╖реНрдЯрд┐ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдк рдбрд╛рдпрд▓реЙрдЧ рдПрдкреАрдЖрдИ рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ

рдХреНрдпрд╛ рд╕рдВрд╡рд╛рдж API рдХреЗрд╡рд▓ рдореБрдЦреНрдп рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реИ?
рд╕рд╛рдорд╛рдиреНрдп рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рджреЛрд╣рд░рд╛рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ рдХреНрдпрд╛ рд╣реИ?

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

@shneorasa рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдкреВрдЫреЗ рдЧрдП рдХреБрдЫ рдорд╣реАрдиреЗ рд╣реЛ рдЧрдП рд╣реИрдВ (рдФрд░ рдЖрдкрдХреЛ рд╢рд╛рдпрдж рдЕрдм рддрдХ рдПрдХ рд╕рдорд╛рдзрд╛рди рдорд┐рд▓ рдЧрдпрд╛ рд╣реИ), рд▓реЗрдХрд┐рди рднрд╡рд┐рд╖реНрдп рдореЗрдВ рд╕рдорд╛рдзрд╛рди рдХреА рддрд▓рд╛рд╢ рдХрд░рдиреЗ рд╡рд╛рд▓реЛрдВ рдХреЗ рд▓рд┐рдП, рдпрд╣рд╛рдВ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХрд╛ рдПрдХ рдмреЗрд╣рддрд░ рддрд░реАрдХрд╛ рд╣реИ window.onbeforeload рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛

beforeunload рдИрд╡реЗрдВрдЯ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рднрд╡рд┐рд╖реНрдп рдХреЗ рд╕рдВрд╡рд╛рджреЛрдВ рдХреЛ рдЧрдбрд╝рдмрдбрд╝ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдЖрдкрдХрд╛ рдРрдк рдЯреВрдЯ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рдЖрдк рдЕрдкрдиреЗ рдРрдк рдХреЗ рдЕрдВрджрд░ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдмреВрд▓рд┐рдпрди рд╕реНрдЯреЛрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреИрд╕реЗ рдореИрдВрдиреЗ рдХрд┐рдпрд╛ рд╣реИ:

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

рдЗрд╕рдХреЗ рд╕рд╛рде, рдЖрдк рдЕрдкрдиреЗ BrowserWindow рдХреЗ close рдИрд╡реЗрдВрдЯ рдХреЛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдмрд╛рдзрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

// 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()
            }
        })
    }
})

рдореИрдВрдиреЗ рдЗрд╕ рд╕рдорд╛рдзрд╛рди рдХреЛ Vue.js рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдЗрд▓реЗрдХреНрдЯреНрд░реЙрди рдРрдк рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рд╣реИ, рдФрд░ рд╕рдВрд╡рд╛рдж рджрд┐рдЦрд╛рдирд╛/рдЫрд┐рдкрд╛рдирд╛ рдЖрдпрд╛рдд рдХрд░рдиреЗ рдЬрд┐рддрдирд╛ рдЖрд╕рд╛рди рд╣реИ app :

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

рдФрд░ рд╕рдВрдЧреНрд░рд╣реАрдд рдмреВрд▓рд┐рдпрди рдорд╛рди рдХреЛ рдЕрдзрд┐рд▓реЗрдЦрд┐рдд рдХрд░рдирд╛:

app.showExitPrompt = true

рд╕рднреА 3 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдХреЛрдИ рдмрд╛рдд рдирд╣реАрдВред рдореИрдВ рдпрд╣ рд╕рдордЭ рдЧрдпрд╛ред

рднрд╡рд┐рд╖реНрдп рдХреЗ рд╕рдВрджрд░реНрдн рдХреЗ рд▓рд┐рдП, рдпрд╣рд╛рдВ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

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

рдирдорд╕реНрддреЗ(:
рдКрдкрд░ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╕рдорд╛рдзрд╛рди рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред
рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЕрднреА рднреА рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЗ "onbeforeunload" рдХреЛ рд▓реЗрддрд╛ рд╣реИ ...
рдХреЛрдИ рд╡рд┐рдЪрд╛рд░?

@shneorasa рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдкреВрдЫреЗ рдЧрдП рдХреБрдЫ рдорд╣реАрдиреЗ рд╣реЛ рдЧрдП рд╣реИрдВ (рдФрд░ рдЖрдкрдХреЛ рд╢рд╛рдпрдж рдЕрдм рддрдХ рдПрдХ рд╕рдорд╛рдзрд╛рди рдорд┐рд▓ рдЧрдпрд╛ рд╣реИ), рд▓реЗрдХрд┐рди рднрд╡рд┐рд╖реНрдп рдореЗрдВ рд╕рдорд╛рдзрд╛рди рдХреА рддрд▓рд╛рд╢ рдХрд░рдиреЗ рд╡рд╛рд▓реЛрдВ рдХреЗ рд▓рд┐рдП, рдпрд╣рд╛рдВ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХрд╛ рдПрдХ рдмреЗрд╣рддрд░ рддрд░реАрдХрд╛ рд╣реИ window.onbeforeload рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛

beforeunload рдИрд╡реЗрдВрдЯ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рднрд╡рд┐рд╖реНрдп рдХреЗ рд╕рдВрд╡рд╛рджреЛрдВ рдХреЛ рдЧрдбрд╝рдмрдбрд╝ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдЖрдкрдХрд╛ рдРрдк рдЯреВрдЯ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рдЖрдк рдЕрдкрдиреЗ рдРрдк рдХреЗ рдЕрдВрджрд░ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдмреВрд▓рд┐рдпрди рд╕реНрдЯреЛрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреИрд╕реЗ рдореИрдВрдиреЗ рдХрд┐рдпрд╛ рд╣реИ:

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

рдЗрд╕рдХреЗ рд╕рд╛рде, рдЖрдк рдЕрдкрдиреЗ BrowserWindow рдХреЗ close рдИрд╡реЗрдВрдЯ рдХреЛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдмрд╛рдзрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

// 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()
            }
        })
    }
})

рдореИрдВрдиреЗ рдЗрд╕ рд╕рдорд╛рдзрд╛рди рдХреЛ Vue.js рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдЗрд▓реЗрдХреНрдЯреНрд░реЙрди рдРрдк рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рд╣реИ, рдФрд░ рд╕рдВрд╡рд╛рдж рджрд┐рдЦрд╛рдирд╛/рдЫрд┐рдкрд╛рдирд╛ рдЖрдпрд╛рдд рдХрд░рдиреЗ рдЬрд┐рддрдирд╛ рдЖрд╕рд╛рди рд╣реИ app :

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

рдФрд░ рд╕рдВрдЧреНрд░рд╣реАрдд рдмреВрд▓рд┐рдпрди рдорд╛рди рдХреЛ рдЕрдзрд┐рд▓реЗрдЦрд┐рдд рдХрд░рдирд╛:

app.showExitPrompt = true
рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

lealife picture lealife  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

diracdeltas picture diracdeltas  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

EladBezalel picture EladBezalel  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

feross picture feross  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

PhilAndrew picture PhilAndrew  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ