我创建了一个简单的电子项目,创建了一个菜单,用于打开文件,直到我从文件中获取数据,一切都很好。我发现没有document
或$
对象,如何将数据传递到DOM,例如p
textContext?
dialog.showOpenDialog({properties: ['openFile']}, (filePath) => {
// read the file
fs.readFile(filePath[0], (err, data) => {
if (err) {
// do something
} else {
// this not work
document.getElementsByTagName("p")[0].textContent = data.toString();
}
})
});
}
答案 0 :(得分:1)
在主流程中(我认为您拥有此代码),您无权访问document
。您必须通过使用IPC,在HTML甚至是全局代码上执行代码来在进程之间进行通信。 (您可以在网上找到很多关于它的文章)
有关详细信息,请参见electron's architecture
。
应对这种情况的一个例子是
main.js
const { app, BrowserWindow, Menu, dialog } = require('electron')
const fs = require('fs')
const path = require('path')
app.once('ready', () => {
let win = new BrowserWindow()
win.loadURL(path.join(__dirname, 'index.html'))
win.setMenu(Menu.buildFromTemplate([
{
label: 'Open File',
click (menuItem, browserWindow, event) {
dialog.showOpenDialog({
properties: ['openFile']
}, (filePath) => {
fs.readFile(filePath[0], (err, data) => {
if (!err) {
browserWindow.webContents.send('print-file', data.toString())
}
})
})
}
}
]))
})
index.html
<html>
<body>
<script>
const { ipcRenderer } = require('electron')
ipcRenderer.on('print-file', (event, datastr) => {
document.getElementsByTagName("p")[0].textContent = datastr
})
</script>
<p></p>
</body>
</html>
答案 1 :(得分:0)
我没有一个可以立即测试此环境的环境,但是我认为您写错了showOpenDialog
。如果您查看https://github.com/geodocker/geodocker-accumulo-geomesa,则第一个参数是可选的浏览器窗口对象。看来您没有使用它,所以您的代码应该是:
dialog.showOpenDialog(null, {properties: ['openFile']}, (filePath) => {
// read the file
fs.readFile(filePath[0], (err, data) => {
if (err) {
// do something
console.log('ERROR: ' + data);
} else {
// this not work
console.log('PASS: ' + data);
document.getElementsByTagName("p")[0].textContent = data.toString();
}
})
});
}
当参数(参数)为可选参数时,您仍然需要发送一些内容。由于您不想使用它,因此我发送了null
,因此showOpenDialog
函数知道您不会使用它。我还添加了一些console.log()
,以便您可以在尝试使用data
之前测试一下结果。
答案 2 :(得分:0)
main.js:
Menu.setApplicationMenu(Menu.buildFromTemplate([
{
label: '&File',
submenu: [
{
label: 'Open',
accelerator: 'CmdOrCtrl+O',
click() {
showOpen()
}
},
{ type: 'separator' },
{
role: 'quit',
accelerator: 'CmdOrCtrl+Q'
}
]
}])
function showOpen() {
dialog.showOpenDialog({
properties: ['openFile']
}).then(result => {
console.log(result.canceled) // Optional
console.log(result.filePaths) // Optional
// Read first file of list (or process an array of files)
readFile(result.filePaths[0])
}).catch(err => {
console.log(err)
})
}
function readFile(filepath) {
fs.readFile(filepath, 'utf-8', (err, data) => {
if(err){
alert("An error ocurred reading the file :" + err.message)
return
}
console.log(JSON.parse(data)) // For JSON file only
})
}
您处理文件而不是 console.log(JSON.parse(data))
,然后使用例如 IPC