如何使用ngIf将输入的焦点放在表单字段中



我面临一个问题,我希望在我的代码中,将重点放在条件输入上基于来自可观察到的数据。在我的示例中,我只是在ngOnInit()中将布尔值设置为true

export class InputOverviewExample implements OnInit {
bool: boolean;
@ViewChild("input1", { static: true }) input1: MatInput;
@ViewChild("input2", { static: true }) input2: MatInput;
ngOnInit() {
this.bool = true;
this.input1.nativeElement.focus();
this.input2.nativeElement.focus();
}
}

我注意到,当mat-form-field被条件化时,焦点不起作用。

<form class="example-form">
<h3>Without *ngIf :</h3>
<mat-form-field appearance="outline" class="example-full-width">
<input matInput #input1 placeholder="Auto focus" value="Test_input1" />
</mat-form-field>
<h3>With *ngIf :</h3>
<mat-form-field appearance="outline" class="example-full-width" *ngIf="bool">
<input matInput #input2 placeholder="Auto focus" value="Test_input2" />
</mat-form-field>
</form>

StackBlitz链接

有人会有一个解决这个问题的

谢谢

您需要了解ViewChild{static:true}和{static:false}以及{read}

因此,首先将ViewChild定义为

@ViewChild("input1", { static: false,read:ElementRef }) input1: ElementRef;
@ViewChild("input2", { static: false,read:ElementRef }) input2: ElementRef;

如果处于*ngIf 下,static:false进行角度检查

CCD_ 5使您的";输入1";以及";输入2";被视为ElementRef,而不是MatInput

您需要的第二件事是Angular的工作方式。Angular执行所有操作并刷新应用程序,因此如果您编写

this.bool = true;
this.input2.nativeElement.focus(); //<--this.input2 is undefined

this.put2是未定义的,因为Angular没有重新绘制应用程序,所以你需要用setTimeout括起来——你可以像对Angular说的那样考虑setTimeout;嘿,别忘了,刷新应用程序后,你需要做另一个指令"-或使用ChangeDetectorRef。

所以

ngOnInit() {
this.bool = true;
setTimeout(()=>{
this.input1.nativeElement.focus();
this.input2.nativeElement.focus();
})
}
ngOnInit() {
this.bool = true;
if(...){
this.input1.nativeElement.focus();
}
else{
this.input2.nativeElement.focus();
}

}

使用QueryList查询元素

import { Component, OnInit, ViewChild,   
QueryList,
ViewChildren, ElementRef, AfterViewInit, ChangeDetectorRef } from "@angular/core";
import { MatInput } from "@angular/material";
import {startWith} from 'rxjs/operators';
/**
* @title Basic Inputs
*/
@Component({
selector: "input-overview-example",
styleUrls: ["input-overview-example.css"],
templateUrl: "input-overview-example.html"
})
export class InputOverviewExample implements OnInit, AfterViewInit {
bool: boolean;
@ViewChild("input1", { static: true }) input1: MatInput;
// @ViewChild("input2", { static: true }) input2: MatInput;
@ViewChildren('input2') input2: QueryList<ElementRef>;
constructor(private cd: ChangeDetectorRef) {
}
ngOnInit() {
this.bool = true;
this.input1.nativeElement.focus();
}
ngAfterViewInit(): void {
this.input2.changes
.pipe(
startWith(true),
)
.subscribe(() => {
this.input2.forEach((elementRef: ElementRef) => {
if(elementRef) {
elementRef.nativeElement.focus();
this.cd.detectChanges();
}
});
});
}
}

演示

相关内容

  • 没有找到相关文章

最新更新