我有一个带有NodeJS和Express的Electron应用程序。我有一个文件(app.js)中的主进程代码和另一个文件(router.js)中的路由。
主文件创建主窗口:
mainWindow = new BrowserWindow({width: 1280, height: 800, icon: iconPath});
每当您单击应用程序中的pdf文档链接时,路径文件都会创建一个新窗口:
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;
});
}
当我关闭主窗口时,我想要关闭任何其他打开的窗口。我一直很难尝试实现这个(两个窗口都在主要过程中,所以我不能根据我的知识使用IPC。)然后我意识到如果我调用app.quit()时主窗口关闭它关闭所有其他窗口:
// 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();
})
我的问题是这是否是一件坏事。它会在没有任何用户输入的情况下终止所有打开的窗口,但是没有未保存的工作可能会丢失,因为所有新窗口都是无法编辑的pdf文件。
答案 0 :(得分:1)
您应该考虑使用状态容器框架(如Redux或Flux)来管理结算。这样,当您收到用户的关闭信号时,您可以发送信号以确保:
app.quit()
,以确保安全退出除此之外,如果您的应用不需要安全关闭,那么app.quit
本身就是关闭电子应用的完美方式。
答案 1 :(得分:0)
一些事情:
首先,你说"两个窗口都在主要过程中,所以我不能尽我所能使用IPC。"实际上,这不是真的。使用BrowserWindow
本身启动另一个进程。在您生成BrowserWindow时,在Electron生态系统(实际上是具有Electron shell UI和API附加组件的Node环境)中,您正在创建新的渲染过程,并且每个渲染过程都具有可用于主要和渲染进程以互相访问。
其次,您询问在mainWindow上app.quit()
事件上使用'close'
(" 我的问题是这是否是一件坏事。&#34)。正如您所说,只要您不担心清理窗口/进程中的任何数据,这样做就可以了。即使您必须清理某些内容,也可以在'close'
事件函数中处理它。所以,不用担心,这不是一件坏事。