Ошибка компиляции HTMLCollectionOf <Element>

Я пишу приложение для электронной коммерции, поэтому у меня появляется всплывающее окно для пользователя при нажатии кнопки «Добавить в корзину», которое позволяет пользователю выбрать разнообразие и количество продукта, который пользователь хочет добавить. Всплывающее окно включает форму выбора и ввод числа. Затем мне нужно получить доступ к тому, что было введено в них, чтобы отобразить соответствующую информацию в корзине.

Я попытался получить доступ к информации, используя:

let input = (<HTMLInputElement>document.getElementsByClassName('number_input'));

Но это дает эту ошибку:

ERROR in src/app/layout/products/products.component.ts(93,18): error TS2352: Type 'HTMLCollectionOf' cannot be converted to type 'HTMLInputElement'. Property 'accept' is missing in type 'HTMLCollectionOf'. src/app/layout/products/products.component.ts(111,14): error TS2352: Type 'HTMLCollectionOf' cannot be converted to type 'HTMLInputElement'.

Не удалось скомпилировать

Visual Studio порекомендовала мне включить unknown в дополнение к HTMLInputElement для доступа к информации, поэтому я попробовал:

let input = (<HTMLInputElement><unknown>document.getElementsByClassName('number_input'));

Но это дает эту ошибку:

ERROR in src/app/layout/products/products.component.ts(91,37): error TS2304: Cannot find name 'unknown'. src/app/layout/products/products.component.ts(109,33): error TS2304: Cannot find name 'unknown'.

Это код для моих входов. Он использует модальное окно из начальной загрузки

<div class = "modal fade" id = "variedades_y_cantidades" tabindex = "-1" role = "dialog" aria-labelledby = "ModalCenterTitle" aria-hidden = "true">
  <div class = "modal-dialog modal-dialog-centered" role = "document">
    <div class = "modal-content">
      <div class = "modal-header">
        <h5 class = "modal-title" id = "bebida_descripcion">AGREGAR {{ bebida.descripcion }}</h5>
      </div>
      <div class = "modal-body">
        <div class = "row">
          <div class = "col"><div class = "form-group">
              <label for = "variadedes">Variaded:</label>
                <select class = "form-control" id = "variadedes">
                    <option *ngFor = "let detalle of detalle_bebida">{{detalle.variedad}}</option>
              </select>
          </div></div>
          <div class = "row"><div class = "col">Cantidad: <input type = "number" name = "cantidad" min = "1" style = "width: 70px;" class = "number_input" value = "1"></div></div>
        </div>
      </div>
      <div class = "modal-footer">
        <button type = "button" class = "btn btn-secondary" data-dismiss = "modal">CERRAR</button>
        <button type = "button" class = "btn btn-primary" (click) = "onModalAgregarClick($event)" data-dismiss = "modal">AGREGAR</button>
      </div>
    </div>
  </div>
</div>

Я хочу иметь доступ к данным без ошибок, чтобы скомпилировать приложение для запуска.

<HTMLInputElement[]> пробовали?

Jai 02.01.2019 15:30

Если вы используете Angular, вы должны использовать [(ngModel)] вместо того, чтобы пытаться получить доступ к элементу DOM.

Mehdi 02.01.2019 15:37

Поскольку getElementsByClassName() может предоставить вам список элементов DOM, вы можете привести его к типу <HTMLCollection>. Если вы хотите обрабатывать каждый элемент индивидуально, вы можете использовать <HTMLInputElement>.

Sachin Gupta 02.01.2019 15:41
<HTMLInputElement[]> выдает эту ошибку: Тип «HTMLCollectionOf <Element>» не может быть преобразован в тип «HTMLInputElement []». Свойство «includes» отсутствует в типе «HTMLCollectionOf <Element>». Приведение типов к <HTMLInputElement> - это то, что я пробовал выше, что дало мне исходную ошибку. Есть другие идеи? Я собираюсь посмотреть [(ngModel)] прямо сейчас
Madeline 02.01.2019 17:41
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
4
802
1

Ответы 1

Вы получаете ошибку компиляции, потому что пытаетесь преобразовать HTMLCollection в HTMLElement.

Ваш вызов document.getElementsByClassName() не возвращает HtmlElement, он возвращает HTMLCollection. Вот полезная документация Mozilla по этой функции. Вам нужно будет обновить приведение, а затем получить доступ к первому элементу коллекции, если он вообще существует.

let numberInputs: HTMLCollection = document.getElementsByClassName('number_input');
let firstNumberInput: HTMLSelectElement = numberInputs[0];
console.info(firstNumberInput.value);

При этом при работе с Angular в этом случае настоятельно рекомендуется использовать директивы. Вместо этого я бы использовал директиву [(ngModel)] или создал реактивную форму для доступа к значениям входов.

Я знаю, что это Коллекция, но я подумал, что вы можете преобразовать ее как HTMLInputElement для доступа к входам. Я следил за этой статьей github ссылка на сайт Ссылка mozilla говорит о доступе к отдельным элементам, но когда я это делаю, я получаю свойство 'value' не существует для элемента типа let input = (document.getElementsByClassName('number_input')); cantidad = input[0].value;

Madeline 02.01.2019 17:49

использование [(ngModel)] было эффективным решением. Спасибо!

Madeline 02.01.2019 18:00

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