InvalidValueError: не экземпляр HTMLInputElement Angular 5

Я пытаюсь выполнить автозаполнение для адреса с помощью API карт Google в своем приложении, но продолжаю получать ошибку «InvalidValueError: не экземпляр HTMLInputElement». Ниже приведены вещи, которые я пробовал

html внутри формы. Как видите, я попробовал фокусировку, но она тоже не сработала.

 <input id = "address" type = "text" name = "address" #address = "ngModel" [(ngModel)] = "markersService.selectedMarker.address" placeholder = "Address" 
    autocorrect = "off"
    autocapitalize = "off"
    spellcheck = "off"
    class = "inputFields"
    required
    (focus) = "autocompleteSearch()"/>

.ts файл

 //I implemented this in an app with Angular 4 and it worked, now with Angular5 it' doesn't
 ngAfterViewInit() {
    this.autocompleteSearch();
 }


  autocompleteSearch() {
    /*
    I tried this trick based on some answers I saw in different places, but it didn't work
    var addressInput = document.getElementById('address').getElementsByTagName('input')[0];
    of course I was passing this in the code below instead of the addressElement
    */
    this.mapsAPILoader.load().then(
      ()=>{
        let autocomplete = new google.maps.places.Autocomplete(this.addressElement.nativeElement, { types:["address"]});
        autocomplete.addListener('places_changed', ()=> {
          this.ngZone.run(()=> {
            let place: google.maps.places.PlaceResult = autocomplete.getPlace();

            if (place.geometry === undefined || place.geometry === null) {
              return;
            }
          });
        })
      }
    )
  }

Я пробовал 4 разные вещи, не повезло, чтобы это работало

Можем ли мы увидеть декларацию для addressElement? Кроме того, находится ли входной элемент внутри цикла ngFor или внутри предка с условием ngIf?

ConnorsFan 01.05.2018 04:36

Что касается "уловки", вы можете попробовать: const addressInput = document.getElementById('address'); и заменить this.addressElement.nativeElement на addressInput (хотя использование document.getElementById не является способом доступа к элементам в Angular).

ConnorsFan 01.05.2018 04:43

@ConnorsFan нет, они не находятся внутри ngIf или ngFor. Вы правы, это не лучший способ сделать это с помощью angular, но я был полон решимости попробовать все, лол. Константа addressInput = document.getElementById ('адрес'); не сработало. Я получаю сообщение об ошибке в коде VS: «Аргумент типа HTMLElement не может быть назначен параметру типа HTMLInputElement. Свойство accept отсутствует в типе HTMLElement».

devpato 01.05.2018 04:55

Покажите, пожалуйста, декларацию addressElement, это самое главное. Для "уловки" попробуйте: const addressInput = document.getElementById('address') as HTMLInputElement;.

ConnorsFan 01.05.2018 05:02

@ConnorsFan @ViewChild ('address') public addressElement: ElementRef; Теперь с const addressInput = document.getElementById('address') as HTMLInputElement; я не получаю исходную ошибку, но автозаполнение не работает, и я больше не вижу ошибок в консоли

devpato 01.05.2018 05:08

@ConnorsFan Я получаю это предупреждение, но без ошибки. Может ли это быть причиной того, что автозаполнение не работает? Synchronous XMLHttpRequest on the main thread is deprecated because of its detrimental effects to the end user's experience. For more help

devpato 01.05.2018 05:31

@ConnorsFan, поэтому я понимаю, что он работает вне модального окна, в модальном он не работает

devpato 02.05.2018 02:56

Переменная шаблона #address привязана к ngModel. Вы должны определить еще один, например #address1, во входном элементе и использовать его в @ViewChild('address1'). Это должно работать (вместо использования document.getElementById). Я не уверен, что это поможет решить другие проблемы.

ConnorsFan 02.05.2018 03:29

@ConnorsFan, может быть, это было частью исправления. Я также заметил, что автозаполнение находится за модальным окном, поэтому я добавил `.pac-container {z-index: 10000! Important; } 'и это заставило его появиться поверх модального окна. Большое спасибо, чувак !! Если хотите, опубликуйте его как ответ, чтобы я мог дать правильный ответ, и вы получите несколько баллов.

devpato 02.05.2018 03:50
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
0
9
761
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Ссылочная переменная шаблона #address привязана к ngModel. Вы можете определить еще один, например #address1:

<input #address1 #address = "ngModel" ... >

и используйте его для доступа к элементу в коде:

@ViewChild('address1') public addressElement: ElementRef;

...

let inputElement = this.addressElement.nativeElement as HTMLInputElement;

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