本文介绍了Angular 5 模拟输入控件上的按键的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我正在尝试在输入控件上按下 Enter 时模拟 Tab 键按下.为此,我使用了一个指令:
I'm trying to simulate tab key press when enter is pressed on input control.For that I use a directive:
private el: ElementRef;
@Input() onEnter: string;
constructor(private _el: ElementRef, public renderer: Renderer) {
this.el = this._el;
}
@HostListener('keydown', ['$event']) onKeyDown(e: any) {
if ((e.which === 13 || e.keyCode === 13)) {
e.preventDefault();
const event = new KeyboardEvent("keypress", {
"key": "Tab"
});
this.el.nativeElement.dispatchEvent(event);
............
回车键代码触发但没有发送标签
code for enter key fires but no tab is sent
推荐答案
更新这个stackblitz(对不起,我不记得我说的那个帖子了)
Updated see better aproach inthis stackblitz(sorry,I don't remember the post where I talk about it)
如果你想使用 ENTER 来聚焦一个元素,你可以使用指令
If you want to use ENTER to focus an element you can use a directive
@Directive({
selector: '[next-tab]',
})
export class NextTabDirective {
@Input('next-tab') nextControl: any;
@HostListener("keydown.enter", ["$event"])
onEnter(event: KeyboardEvent) {
if (this.nextControl) {
if (this.nextControl.focus) {
this.nextControl.focus();
this.nextControl.select();
event.preventDefault();
return false;
}
}
}
constructor(private control: NgControl) {
}
}
你可以像
<form (submit)="Submit()">
<input #input0 [next-tab]="input1" />
<input #input1 [next-tab]="input2" />
<!--the last not have [next-tab]-->
<!-an ENTER make a submit -->
<input #input2 />
<button type="button" (click)="cancel()">Cancel</button>
<button type="submit">OK</button>
</form>
我不想使用这种丑陋的解决方法,但我们可以改进指令作为下一个选项卡发送控件数组
I would like not use this ugly work-around, but we can improve the directive sending as next-tab an array of controls
@Directive({
selector: '[next-tab]',
})
export class NextTabDirective {
@Input('next-tab') nextControl: any[]; //<--an array of controls
@HostListener("keydown.enter", ["$event"])
onEnter(event: KeyboardEvent) {
//find the nextControl not disabled. We check if c is defined
//This allow us to use *ngIf and not put the control
let nextControl=this.nextControl.find(c=>c && !c.disabled);
if (nextControl) {
if (nextControl.focus) {
nextControl.focus();
nextControl.select();
event.preventDefault();
return false;
}
}
}
constructor(private control: NgControl) {
}
}
表格看起来像
<form (submit)="Submit()">
<!--see that we create an array-->
<input #input0 [next-tab]="[input1,input2,input3]" />
<input #input1 [next-tab]="[input2,input3]" />
<!--if only one element, we make an array of one element-->
<input #input2 [style.display]="existInput2?'inherit':'none'" [next-tab]="[input3]" />
<!--if we want make invisible control NOT use *nfIf, therefore, we must hidden and disabled too -->
<input #input3 />
<button type="button" (click)="cancel()">Cancel</button>
<button type="submit">OK</button>
</form>
最后我在 https://stackblitz.com/edit/angular-v8fkkf一个>
这篇关于Angular 5 模拟输入控件上的按键的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!