在 MatStepper 中进入下一步后的焦点输入

Jac*_*sza 8 angular-material2 angular

在单击第一步的“下一步”按钮后,如何以编程方式将焦点设置为“地址”输入,因此在从第 1 步(“填写您的姓名”)到第 2 步(“填写您的地址”)之后。

https://stackblitz.com/angular/onnbkqrydrg?file=app%2Fstepper-overview-example.ts https://material.angular.io/components/stepper/overview

在此处输入图片说明

在此处输入图片说明

这就是我想要实现的目标:

在此处输入图片说明

我已经在试验 MatStepper 的 selectionChange 事件,但它似乎在第 2 步可见之前被触发,所以它不起作用。

Nar*_*arm 11

您使用选择更改事件走在正确的道路上。查看分叉的 StackBlitz:

闪电战

您要做的是id为您的输入元素分配一个可以与步进器的选定索引相关联的元素,例如:

  <mat-step [stepControl]="firstFormGroup">
    <form [formGroup]="firstFormGroup">
      <ng-template matStepLabel>Fill out your name</ng-template>
      <mat-form-field>
        <input id="input0" matInput placeholder="Last name, First name" formControlName="firstCtrl" required>
      </mat-form-field>
      <div>
        <button mat-button matStepperNext>Next</button>
      </div>
    </form>
  </mat-step>
  <mat-step [stepControl]="secondFormGroup">
    <form [formGroup]="secondFormGroup">
      <ng-template matStepLabel>Fill out your address</ng-template>
      <mat-form-field>
        <input  id="input1" matInput placeholder="Address" formControlName="secondCtrl" required>
      </mat-form-field>
      <div>
        <button mat-button matStepperPrevious>Back</button>
        <button mat-button matStepperNext>Next</button>
      </div>
    </form>
  </mat-step>
Run Code Online (Sandbox Code Playgroud)

然后通过使用选择 (selectionChange) 事件,您可以在等待输入元素在 DOM 中显示后将焦点设置在输入元素上:

export class StepperOverviewExample implements AfterViewInit {
  isLinear = false;
  firstFormGroup: FormGroup;
  secondFormGroup: FormGroup;

  public targetInput = 'input0';

  constructor(private _formBuilder: FormBuilder) { }

  ngOnInit() {
    this.firstFormGroup = this._formBuilder.group({
      firstCtrl: ['', Validators.required]
    });
    this.secondFormGroup = this._formBuilder.group({
      secondCtrl: ['', Validators.required]
    });
  }

  ngAfterViewInit() {
    this.setFocus();
  }

  private setFocus() {
    let targetElem = document.getElementById(this.targetInput);
    setTimeout(function waitTargetElem() {
      if (document.body.contains(targetElem)) {
        targetElem.focus();
      } else {
        setTimeout(waitTargetElem, 100);
      }
    }, 100);
  }

  onChange(event: any) {
    let index = String(event.selectedIndex);
    this.targetInput = 'input' + index;
    this.setFocus();
  }
}
Run Code Online (Sandbox Code Playgroud)