我有两个在(->> (str n)
seq
(map (comp read-string str)))
条件下显示的输入元素。
*ngIf
单击按钮应将焦点设置为适当的输入元素。
<input type="text" id="textInput" *ngIf="showTextInput">
<input type="number" id="numericInput" *ngIf="showNumericInput">
<button (click)="editButtonClicked($event)">
我研究了 ElementRef ,以提供html输入元素标签,例如editButtonClicked(event) {
// Focus on either #textInput or #numericInput element
}
,然后在类中定义它们,例如:
#textInput
...但是显然,这不适用于具有@ViewChild('textInput') textInput: ElementRef;
条件的元素。
我如何专注于输入元素,即单击按钮?
答案 0 :(得分:3)
你可以实现一个超级简单的指令并达到预期的效果。
html
<input type="text" autoFocus *ngIf="isInputVisible">
指令
import { Directive, ElementRef, OnInit } from "@angular/core";
@Directive({
selector: "[autoFocus]"
})
export class AutoFocusDirective implements OnInit {
private inputElement: HTMLElement;
constructor(private elementRef: ElementRef) {
this.inputElement = this.elementRef.nativeElement;
}
ngOnInit(): void {
this.inputElement.focus();
}
}
工作演示:
https://stackblitz.com/edit/angular-ivy-vvgcch?file=src%2Fapp%2Fdirectives%2Fauto-focus.directive.ts
答案 1 :(得分:1)
是@ViewChild
对受结构指令控制的元素不起作用。您可以应用两种解决方法:
删除*ngIf
指令,并使用CSS style: 'display:none'
隐藏元素。
使用原始Javascript document.getElementById('someId');
从DOM中选择元素,然后集中该元素。
我更喜欢第1点。
答案 2 :(得分:1)
如果您正在寻找的话,也可以通过模板引用变量来完成此操作
以html
<input #text type="text" id="textInput">
<input #number type="number" id="numericInput">
<button (click)="editButtonClicked($event, text, number)"> Click </button>
在ts
editButtonClicked(e, text, number){
if(text.value) {
text.focus()
} else {
number.focus()
}
}