在electron项目中,通常使用保存对话框或者其他对话框时会使用electron的ipcMain和dialog
// main.js
const {app, BrowserWindow, ipcMain, dialog} = require('electron');
ipcMain.on('save-file-dialog', function (event) {
let startPath = 'target/output';
if (process.platform === 'win32') {
startPath = process.cwd() + '\\target\\output\\output.csv'
}
dialog.showSaveDialog({
title: 'Save a file...',
defaultPath: startPath,
buttonLabel: "save...",
filters: [
{name: 'csv', extensions: ['csv']}
]
}).then(r => {
if (r.filePath) event.sender.send('savedItem', r.filePath)
})
})
// index.js
const ipcSave = require('electron').ipcRenderer;
function demo() {
ipcSave.send('save-file-dialog');
ipcSave.on('savedItem', function (event, path) {
console.log(path);
// 函数内容
});
}
这里会因为多次调用demo函数而增加on的监听次数,导致多次触发。
一般解决方法有两种:
// 第一种
function demo() {
ipcSave.send('save-file-dialog');
ipcSave.once('savedItem', function (event, path) {
console.log(path);
// 函数内容
});
}
// 第二种
function demo() {
ipcSave.send('save-file-dialog');
}
ipcSave.on('savedItem', function (event, path) {
console.log(path);
// 函数内容
});