Электронный новичок, как читать файл из меню в html? - PullRequest
0 голосов
/ 09 апреля 2019

Я создаю простой электронный проект, создаю Меню, для открытого файла, все хорошо, пока я не получу данные из файла.Я обнаружил, что нет объекта 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();
            }
        })
    });
}

Ответы [ 2 ]

1 голос
/ 11 апреля 2019

У вас нет доступа к 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>
0 голосов
/ 09 апреля 2019

У меня нет среды, где я могу проверить это прямо сейчас, но я думаю, что вы пишете showOpenDialog неправильно.Если вы посмотрите на справочную страницу , то первый аргумент - это необязательный объект окна браузера.Похоже, вы его не используете, поэтому ваш код должен быть:

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...