【问题标题】:set focus in input element after submit and reset form提交和重置表单后在输入元素中设置焦点
【发布时间】:2017-08-23 09:24:53
【问题描述】:

我正在使用带有 angular2 的模板表单组件,提交表单后我无法在我的 firstName 输入元素中设置焦点。表单已重置,但无法设置焦点。

这是我的组件代码:

export class TemplateFormComponent {

  @ViewChild('f') form: any;

  onSubmit() {
    if (this.form.valid) {
      console.log("Form Submitted!");
      this.form.reset();
      this.form.controls.firstName.focus();
    }
  }
}

和我的模板代码:

<form novalidate autocomplete="off" #f="ngForm" (ngSubmit)="onSubmit()">
<div class="form-group">
  <label>First Name</label>
  <input type="text"
         class="form-control"
         name="firstName"
         [(ngModel)]="model.firstName"
         required
         #firstName="ngModel">
</div>
</form>

【问题讨论】:

    标签: form-submit angular2-forms setfocus


    【解决方案1】:

    简单的解决方案:将“自动对焦”添加到您的输入元素属性中。

    <input type="text" class="form-control" name="firstName" autofocus required>
    

    【讨论】:

      【解决方案2】:

      有关更通用的解决方案,请参阅

      Is it possible to get native element for formControl? `

      @Directive({
          selector: '[ngModel]',
      })
      export class NativeElementInjectorDirective {
          constructor(private el: ElementRef, private control : NgControl) {
              (<any>control.control).nativeElement = el.nativeElement;
          }
      }
      

      `

      将指令添加到模块后,这会将 nativeElement 添加到每个表单控件。

      更新:这个用例的一个更简单的解决方案 要将焦点设置在表单上的第一个无效元素上,请创建如下指令:

      import { Directive, HostListener, ElementRef} from '@angular/core';
      
      @Directive({
        selector: '[focusFirstInvalidField]'
      })
      export class FocusFirstInvalidFieldDirective {
      
        constructor(private el: ElementRef) { }
      
        @HostListener('submit')
        onFormSubmit() {
          const invalidElements = this.el.nativeElement.querySelectorAll('.ng-invalid');
          if (invalidElements.length > 0) {
            invalidElements[0].focus();
          }
        }
      }
      

      然后只需将其添加到您的表单元素标签中

      【讨论】:

        【解决方案3】:

        在您的视图中,设置对您想要关注的输入字段的引用(您已经拥有 #firstName)。

        然后,在您的组件代码上,使用@ViewChild 创建对其的访问权限:

        @ViewChild('firstName') firstNameRef: ElementRef;

        最后,在重置表单之后:

        this.firstNameRef.nativeElement.focus()

        ps.:我希望 FormControl api 公开一个焦点方法,但 this issue on gitHub 暗示它可能永远不会发生。

        【讨论】:

        • 从今天起这似乎不再起作用了,你会得到一个ERROR TypeError: Cannot read property 'focus' of undefined。我解决了在模板中添加对输入元素 (#firstNameRef) 的第二个引用并调用 @ViewChild('firstNameRef') firstNameRef: ElementRef;
        猜你喜欢
        • 2012-06-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-12-27
        • 2017-08-12
        • 1970-01-01
        • 2020-05-15
        • 1970-01-01
        相关资源
        最近更新 更多