如何使用Electron的IPC与showOpenDialog?

3

我正在学习在我的 Electron 应用程序中不使用 remote,现在我到了需要从渲染器打开文件的步骤,我理解这需要主进程来显示文件对话框并返回结果。

在我的 main.js 中,我有以下内容:

ipcMain.on('open-file',(event,data)=>{
    dialog.showOpenDialog(null, data, (filePaths) => {
        event.sender.send('open-file-paths', filePaths);
    });
});

在我的渲染过程中,我称之为 pager.js,我有以下内容:
ipcRenderer.send('open-file',{
    title: 'Title',
    defaultPath: localStorage.getItem('defaultPath')
});
ipcRenderer.on('open-file-paths',(event,data)=>{
    console.log(event);
    console.log(data);
});

文件打开对话框还算工作正常,但我不知道如何获取结果。 ipcRenderer.on('open-file-paths',…) 没有被调用,显然这不是正确的方法。我想要获取选定的路径或取消消息。

在渲染进程中,如何获取 showOpenDialog 的结果?

1个回答

3

好的,我想我明白了。

感谢在ShowOpenDialog not working on recent versions of electron-js中的回答,我发现showOpenDialog现在返回一个promise,这意味着需要重新编写main.js中的代码。以下是一个可行的解决方案:

//  main.js
    ipcMain.on('open-file',(event,data)=>{
        dialog.showOpenDialog(null, data).then(filePaths => {
            event.sender.send('open-file-paths', filePaths);
        });
    });

//  pager.js (render)
    ipcRenderer.send('open-file',{
        title: 'Title',
        defaultPath: localStorage.getItem('defaultPath')
    });
    ipcRenderer.on('open-file-paths',(event,data)=>{
        console.log(`Canceled? ${data.canceled}`);
        console.log(`File Paths: ${data.filePaths.join(';')`);
    });

或者您可以使用同步方法 dialog.showOpenDialogSync([browserWindow, ]options) - Артем Межеловский

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接