Элемент формы Angular 2 Focus

#angular #focus #angular2-forms

#angular #фокусировка #angular2-forms #angular2-формы

Вопрос:

Я создал форму с помощью angular 2, и теперь я хочу добавить некоторую проверку формы. Проверка работает, но теперь я хочу сосредоточиться на элементах формы. Возможно ли это в angular 2. Что я нашел до сих пор, так это то, что я могу сфокусировать элемент с помощью ElementRef и средства визуализации, то есть

 this.renderer.invokeElementMethod(this.el.nativeElement, 'focus');
  

Но я не хочу получать доступ к элементу через ElementRef вместо этого я хочу установить фокус на один из моих AbstractControl в моем объекте FormGroup. т.е

 this.form.controls[ controlIndex ].focus
  

возможно ли это с angular 2? Если нет, то как я могу установить фокус на элемент управления формой?

Ответ №1:

Текущее состояние в Angular 8

Это все еще невозможно сделать с помощью ReactiveForm . Для этого все еще необходимо создать специальную директиву.

 import { Directive, HostListener, ElementRef } from '@angular/core';
import { isPlatformBrowser } from '@angular/common';
import { FormGroup } from '@angular/forms';

@Directive({
  selector: '[focusInvalidInput]'
})
export class FormDirective {

  constructor(private el: ElementRef) { }

  @HostListener('submit')
  onFormSubmit() {
    const invalidControl = this.el.nativeElement.querySelector('.ng-invalid');

    if (invalidControl) {
      invalidControl.focus();  
    }
  }
}
  

Используется вот так:

 <form focusInvalidInput [formGroup]="form" (ngSubmit)="submit()">
  <label for="first">First Name</label>
  <input formControlName="first" id="first" />

  <label for="last">Last Name</label>
  <input formControlName="last" id="last" />

  <br />
  <button>submit</button>
</form>
  

Демонстрация: https://stackblitz.com/edit/angular-fesawc

Ответ №2:

Одним из подходов было бы создание директивы и передача this.form.controls[ controlIndex ].hasError ей в качестве параметра:

 @Directive({
    selector: '[focus-on-error]'
})
export class FocusOnErrorDirective implements AfterViewInit {
    constructor(public element: ElementRef) {}
    @Input('focusOnError') focusOnError;

    ngAfterViewInit() {
        // put all your focusing logic here
        // watches are also available here
        element.focus()
    }
}
  

Затем вы можете использовать его в своих элементах формы:

 <input type="text" focus-on-error="form.controls[ controlIndex ].hasError">
  

Комментарии:

1. Спасибо за вашу помощь, я попробую ваш подход сегодня.