Как загрузить файл в TypeScript

Я новичок в Typescript и у меня проблема с синтаксисом. Я хочу загрузить выбранный пользователем файл (не используя JQuery) и пока распечатать результаты на консоли. Я следовал некоторым руководствам в JS, но безуспешно. Это то, что у меня есть до сих пор.

index.html

<input type = "file" id = "file-input" >

index.ts

document.getElementById("file-input").addEventListener("change", e => {
  var reader = new FileReader();
  var self = this;
  reader.onload = file => {
      var contents: any = file.target;
      self.text = contents.result; 
  };
  console.info(self.text.toString());
}, false);  

Это дает следующую ошибку в отчете консоли:

Uncaught TypeError: Cannot read property 'toString' of undefined
    at HTMLInputElement.<anonymous>

Я не совсем уверен, как получить текст из буфера и правильно ли я его настраиваю.

ОБНОВИТЬ: Текущий код с изменениями:

document.getElementById("file-input").addEventListener("change", async (e) => {
  var file = (<HTMLInputElement>e.target).files[0];
  var reader = new FileReader();
  reader.onload = file => {
      var contents: any = file.target;
      this.text = contents.result; 
      console.info(this.text.toString());
  };
}, false);

Вам нужно дождаться его загрузки.

SLaks 02.05.2019 23:49

Переместите console.info внутри обратного вызова, который называется асинхронно, когда файл, наконец, загружен, спустя много времени после возврата функции прослушивателя события изменения ввода файла.

JB Nizet 02.05.2019 23:52

Кроме того, эта переменная self не нужна. Просто используйте this: ​​это то, что позволяют функции стрелок.

JB Nizet 02.05.2019 23:54

Я думал, что это так, @JBNizet, я переместил console.info внутрь обратного вызова. Однако тогда я не получаю никакого отображения консоли (или ошибок). Я исправил использование переменной self.

Shawn 02.05.2019 23:56

Это потому, что ты никогда не читал файл. Все, что вы делаете, это говорите, что делать, когда это прочитано. Но вам нужно вызвать чтение: developer.mozilla.org/en-US/docs/Web/API/FileReader/onload

JB Nizet 03.05.2019 00:02

В этом есть смысл. Пожалуйста, простите мою тупость. Я обновил модифицированный пример. Мне пришлось использовать e.target, чтобы пройти компиляцию. Я на правильном пути?

Shawn 03.05.2019 00:16
Зод: сила проверки и преобразования данных
Зод: сила проверки и преобразования данных
Сегодня я хочу познакомить вас с библиотекой Zod и раскрыть некоторые ее особенности, например, возможности валидации и трансформации данных, а также...
Как заставить Remix работать с Mantine и Cloudflare Pages/Workers
Как заставить Remix работать с Mantine и Cloudflare Pages/Workers
Мне нравится библиотека Mantine Component , но заставить ее работать без проблем с Remix бывает непросто.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
TypeScript против JavaScript
TypeScript против JavaScript
TypeScript vs JavaScript - в чем различия и какой из них выбрать?
Синхронизация localStorage в масштабах всего приложения с помощью пользовательского реактивного хука useLocalStorage
Синхронизация localStorage в масштабах всего приложения с помощью пользовательского реактивного хука useLocalStorage
Не все нужно хранить на стороне сервера. Иногда все, что вам нужно, это постоянное хранилище на стороне клиента для хранения уникальных для клиента...
Что такое ленивая загрузка в Angular и как ее применять
Что такое ленивая загрузка в Angular и как ее применять
Ленивая загрузка - это техника, используемая в Angular для повышения производительности приложения путем загрузки модулей только тогда, когда они...
0
6
398
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Сосредоточьтесь на коде

  reader.onload = file => {
      var contents: any = file.target;
      self.text = contents.result; 
  };
  console.info(self.text.toString());

Порядок выполнения, который, по вашему мнению, имеет:

  reader.onload = file => {
      var contents: any = file.target;
      self.text = contents.result; // FIRST 
  };
  console.info(self.text.toString()); // SECOND 

Порядок исполнения в реальности:

  reader.onload = file => {
      var contents: any = file.target;
      self.text = contents.result; // SECOND
  };
  console.info(self.text.toString()); // FIRST 

Следовательно, вы получаете сообщение об ошибке, поскольку .text не назначено ко времени запуска self.text.toString.

ИСПРАВИТЬ

В одну сторону:

  reader.onload = file => {
      var contents: any = file.target;
      self.text = contents.result; // FIRST
      console.info(self.text.toString()); // SECOND ?
  };

Другие вопросы по теме