#javascript #electron
#javascript #electron
Вопрос:
Я довольно новичок в мире программирования. Я создаю приложение, в котором должна быть возможность выбрать каталог, где сохранить некоторые сгенерированные файлы.
Я работаю с ipc, и кажется, что часть кода работает, но, похоже, я не могу заставить mainIpc отправить путь обратно в средство визуализации.
Я надеюсь, что улей может помочь, заранее спасибо!
Средство визуализации:
const electron = require("electron");
const ipc = require("electron").ipcRenderer;
createBtn.addEventListener("click", (event) => {
ipc.send("path:get");
});
ipc.on("path:selected", function (path) {
console.log("Full path: ", path);
});
Главная
const ipc = require("electron").ipcMain;
const os = require("os");
const { dialog } = require("electron");
ipc.on("path:get", function (event) {
if (os.platform() === "linux" || os.platform() === "win32") {
dialog.showOpenDialog(
{
properties: ["openFile"],
},
function (files) {
if (files) win.webContents.send("path:selected", files[0]);
console.log("SENT");
}
);
} else {
dialog.showOpenDialog(
{
properties: ["openFile", "openDirectory"],
},
function (files) {
if (files) win.webContents.send("path:selected", files[0]);
console.log("SENT");
}
);
}
});
Редактировать: добавление настройки
Настройка
const { app, BrowserWindow } = require("electron");
const ipc = require("electron").ipcMain;
const os = require("os");
const { dialog } = require("electron");
try {
require("electron-reloader")(module);
} catch (_) {}
let win;
function createWindow() {
win = new BrowserWindow({
width: 800,
height: 600,
webPreferences: {
nodeIntegration: true,
},
});
win.loadFile("./src/index.html");
}
app.whenReady().then(createWindow);
app.on("window-all-closed", () => {
if (process.platform !== "darwin") {
app.quit();
}
});
app.on("activate", () => {
if (BrowserWindow.getAllWindows().length === 0) {
createWindow();
}
});
Комментарии:
1. вы уверены
win
, что он доступен там, где вы его вызываете?2. добавил свою настройку. Я объявил
win
об этом в глобальном масштабе. Так что я уверен, что он доступен.
Ответ №1:
Я понял это с некоторой помощью. Так что, если кому-то понадобится такая же процедура, я попытаюсь объяснить, к чему я пришел.
Итак, в основном, мне пришлось добавить then , потому что ShowDialog возвращает обещание
if (os.platform() === "linux" || os.platform() === "win32") {
dialog
.showOpenDialog({
properties: ["openFile", "openDirectory"],
})
.then((result) => {
if (result) win.webContents.send("path:selected", result.filePaths);
})
.catch((err) => {
console.log(err);
});
} else {
dialog
.showOpenDialog({
properties: ["openFile", "openDirectory"],
})
.then((result) => {
console.log(result.filePaths);
if (result) win.webContents.send("path:selected", result.filePaths);
})
.catch((err) => {
console.log(err);
});
}
});
Это отправляет обратно массив с путем в [0]
в программе визуализации я забыл добавить событие в качестве параметра.
ipc.on("path:selected", (event, path) => {
chosenPath = path;
console.log("Full path: ", chosenPath[0]);
});