2017-03-07 1 views
1

Ich habe eine Electron App mit NodeJS und Express. Ich habe den Hauptprozesscode in einer Datei (app.js) und die Routen in einer anderen Datei (router.js).Ist es eine schlechte Übung, app.quit() zu verwenden, um alle geöffneten Fenster in einer Elektronen-App zu schließen?

Die Hauptdatei erstellt das Hauptfenster:

mainWindow = new BrowserWindow({width: 1280, height: 800, icon: iconPath}); 

Die Routen-Datei erstellt ein neues Fenster, wenn Sie auf einem PDF-Dokument Link in der Anwendung klicken:

router.get('/docs/:module/:type/:file', function(req, res) { 
    openPDF(req.params.module,req.params.type,req.params.file); 
    res.end(); 
}); 

// open pdf's in a new window 
let newWindow; 
const openPDF = function(module,filetype,filename) { 

    let file = 'file:///' + __dirname + '/app/docs/' + module + '/' + filetype + '/' + filename; 

    let newWindow = new BrowserWindow({ 
    width: 800, 
    height: 600, 
    icon: iconPath, 
    webPreferences: { 
     nodeIntegration: false 
    } 
    }); 

    newWindow.setMenu(null); 
    // newWindow.webContents.openDevTools(); 

    const param = qs.stringify({file: file}); 

    newWindow.loadURL('file://' + __dirname + '/app/pdfjs/web/viewer.html?' + param); 

    newWindow.on('closed', function() { 
    newWindow = null; 
    }); 
} 

Wenn schließe ich die Haupt Fenster Ich möchte auch andere offene Fenster schließen. Ich habe eine schwierige Zeit versucht, dies zu implementieren (beide Fenster sind im Hauptprozess, so kann ich IPC nicht nach meinem besten Wissen verwenden.) Dann erkannte ich, dass wenn ich app.quit() wenn das Hauptfenster aufrufen schließt es alle anderen Fenster schließt:

// Emitted when the window is closed. 
    mainWindow.on('closed', function() { 
    // Dereference the window object, usually you would store windows 
    // in an array if your app supports multi windows, this is the time 
    // when you should delete the corresponding element. 
    mainWindow = null 
    // quitting the app on main window close will close any other open windows 
    app.quit(); 
    }) 

Meine Frage ist, ob dies eine schlechte Sache zu tun ist. Es beendet alle geöffneten Fenster ohne Benutzereingaben, aber es gibt keine ungespeicherte Arbeit, die verloren gehen könnte, da alle neuen Fenster PDF-Dateien wären, die nicht bearbeitet werden können.

+0

Wenn die folgende Antwort Ihnen geholfen hat, stellen Sie bitte sicher, dass Sie sie upvoten/akzeptieren, um anderen zu helfen, die das gleiche Problem haben könnten! –

Antwort

1

Sie sollten in Betracht ziehen, ein State-Container-Framework wie Redux oder Flux zu verwenden, um das Schließen zu verwalten. Auf diese Weise, wenn Sie das Schließen-Signal von dem Benutzer empfangen, können Sie ein Signal versenden, um sicherzustellen, zu:

  • Prompt der Benutzer, wenn ihre Daten nicht gespeichert sind
  • die Konfigurationsdaten der App-Puffer auf eine Datei wenn Sie würde, wie (fortsetzen aus vorherigen Zustand beim nächsten Start)
  • Dann app.quit() laufen, so können Sie

Anders als das eine sichere Ausfahrt gewährleisten, wenn Ihre Anwendung nicht sicher-close erfordert, dann app.quit von itse Es ist eine sehr gute Möglichkeit, deine Elektronen-App zu schließen.

+0

React/Redux ist definitiv auf meiner Bedürfnis-zu-lernen-Liste! – SmellydogCoding

0

Ein paar Dinge:

Zuerst sagen Sie „beiden Fenster im Hauptprozess sind, so kann ich IPC nicht zum besten Wissen nutzen.“ Eigentlich ist das nicht wahr. Die Verwendung von BrowserWindow selbst startet einen anderen Prozess. Im Electron Ecosystem (das ist wirklich die Node-Umgebung mit Electron Shell UI und API-Add-Ons), wenn Sie BrowserWindows erzeugen, erstellen Sie neue Render-Prozesse und für jeden dieser Render-Prozesse stehen IPC-Kanäle sowohl für den Haupt- als auch den Render-Prozess zur Verfügung einander.

Zweitens Sie bitten, die app.quit() auf dem 'close' Ereignis auf dem Mainwindow über die Verwendung („Meine Frage ist, ob dies eine schlechte Sache ist. Zu tun“). Dies ist, wie Sie sagen, in Ordnung, solange Sie sich nicht darum sorgen, Daten im Fenster/Prozess zu bereinigen. Selbst wenn Sie etwas aufräumen müssten, könnten Sie damit in der Ereignisfunktion 'close' umgehen. Also, mach dir keine Sorgen, es ist keine schlechte Sache zu tun.

+0

Wenn ich versuche, Renderer im neuen Fenster zu verwenden, erhalte ich eine Fehlermeldung, dass das Modul nicht definiert ist.Ich habe irgendwo anders gelesen, weil der Renderer nicht im Hauptprozess verfügbar ist. Deshalb verwende ich den Begriff "nach bestem Wissen". Ich bin noch neu dabei! – SmellydogCoding

Verwandte Themen