2016-09-19 4 views
7
  • Ich mache eine Schreibanwendung. Benutzer können die App öffnen, etwas Text schreiben, ihre Arbeit speichern usw.
  • Ich versuche es so zu machen, dass der Benutzer durch Klicken auf die Schaltfläche window close aufgefordert wird, (a) seine Arbeit zu speichern (falls erforderlich) oder (b) Hör einfach auf.
  • Ich versuche window.beforeunload zu verwenden, um dies zu erreichen, aber finde, dass ich in einer Schleife stecke, wo der Versuch, "aufzuhören", die gleiche Aufforderung ad infinitum erscheint.

Hier einige Code:Aufforderung zum Speichern/Beenden vor dem Schließen des Fensters

windowCloseCheck() { 
window.onbeforeunload = function(e) { 
    e.returnValue = false; 
// window.alert('try to close me');  
if(file.isUnsaved() || file.hasChanged()) { 
    // prompt - save or just quit? 
    file.fileWarning('You have unsaveeed work.', 'Save', 'Quit', function(){ 
    // OPTION A - save 
    file.save(); 
    }, function() { 
    // OPTION B: Quit. 
    ipcRenderer.send('quitter') 
    }) 
} 

else { 
    // file is saved and no new work has been done: 
    ipcRenderer.send('quitter') 
} 

windowCloseCheck aufgerufen wird, wenn die Anwendungs-Setup ist, für ein Ereignis-Listener initiiert das Fenster zu schließen. Meine Bedingung überprüft, ob die Datei nicht gesichert ist oder sich vom Original geändert hat.

fileWarning ist eine Funktion, die nur das Elektronendialogfeld umschließt, so dass ein Popup mit zwei Auswahlmöglichkeiten und entsprechenden Funktionen für jede Wahl erscheint. Der Rest des Codes ist available, wenn ich (wahrscheinlich) notwendige Informationen weglassen werde. Würde mich freuen zu klären, ob ich nicht ganz klar bin.

enter image description here

Antwort

0

Ich landete mit window.destroy() ging mit dem Renderprozess Bits zu zerschlagen (aus dem Hauptprozess):

ipcMain.on('quitter', (e) => { 
    mainWindow.destroy(); // necessary to bypass the repeat-quit-check in the render process. 
    app.quit() 
}) 

Nicht wirklich sicher, ob dies wird empfohlen, da es scheint besser zu sein Möglichkeiten, eine Elektronen-App ordnungsgemäß zu beenden. Immer noch gerne ein Feedback zu erhalten, wenn Sie eine bessere Antwort wissen!

/Achselzucken!

9

Bitte folgenden Block innerhalb der Funktion hinzufügen, in dem Sie Browserfenster definiert haben (In meinem Fall ist es create() Funktion in main.js erklärt)

// Create the browser window. 
    mainWindow = new BrowserWindow({width: 400, height: 400}) 


    mainWindow.on('close', function(e){ 
    var choice = require('electron').dialog.showMessageBox(this, 
     { 
      type: 'question', 
      buttons: ['Yes', 'No'], 
      title: 'Confirm', 
      message: 'Are you sure you want to quit?' 
     }); 
     if(choice == 1){ 
     e.preventDefault(); 
     } 
    }); 
+0

Dies ist bei weitem der beste Weg, dieses Problem anzugehen. Ich habe seit ein paar Tagen verschiedene Ansätze ausprobiert und es gibt immer etwas, das umgangen werden muss. Dieser Ansatz funktioniert jedoch perfekt und es ist so ziemlich die einzige Möglichkeit, dies ohne Probleme zu tun ... zumindest in der Electron Version 1.4.15 – Darthur

1

Awijeet Lösung ist einfach perfekt! Bth, thx Awijeet: es rettete mir Stunden! ;-)

Darüber hinaus, wenn Sie weiter gehen müssen, beachten Sie e.preventDefault() verbreitet sich überall im Code. Sobald Sie die preventDefault() richtig verwaltet haben, müssen Sie die Variable e.defaultPrevented = false drehen, um zum natürlichen Verhalten Ihrer App zurückzukehren.

Eigentlich, so scheint es e.preventDefault() Funktion die Variable e.defaultPrevented zu true turnind wird, bis Sie ihren Wert ändern.

+0

e.defaultPrevented = false Das ist, was ich gesucht habe. Danken! –

Verwandte Themen