我面临一个问题,我希望在我的代码中,将重点放在条件输入上基于来自可观察到的数据。在我的示例中,我只是在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();
}
});
});
}
}
演示