Angular 2 焦点表单元素

标签 angular focus angular2-forms

我创建了一个带有 angular 2 的表单,现在我想添加一些表单验证。验证工作正常,但现在我想专注于表单元素。这在 Angular 2 中是否可能?到目前为止我发现我可以使用 elementRef 和 Renderer 来聚焦元素,即

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

但我不想通过 elementRef 访问元素,而是想将焦点设置到我的 FormGroup 对象中的 AbstractControl 之一。即

this.form.controls[ controlIndex ].focus

Angular 2 是否可行?如果不是,我如何将焦点设置到表单控件?

最佳答案

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

关于Angular 2 焦点表单元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40218128/

相关文章:

html - 哪些 HTML 元素即使使用 tabindex 也不可制表?

c++ - Qt:一旦显示,如何将光标焦点转移到“查找”对话框/工具中的字段?

java - 无法将焦点转移到未显示的 CardLayout JPanel

angular - 选择 Angular2 的双向绑定(bind)

angular - 选择列表设置所选项目 Angular 2 ngModel

angular - Ionic 2 - 是否可以使用 poptoRoot 函数提供 navParams ?

Angular - 多选下拉组件,在列表底部带有按钮“应用”和“取消”

angular - Angular2 中的自定义异常处理程序

javascript - 在 MS Edge 中禁用表单完成

angular - 如何在 Angular 中使用多个 ViewChild 元素 (2/4)