html - 如何在 Angular Material 中将 Tab 键设为回车键?

标签 html angular events autocomplete angular-material

这是我的 Angular Material 自动完成代码

<input type="search" id="setId" name="setId" [attr.list]='collectionType' [(ngModel)]="selValue" class="text-box"
  placeholder="--Select--" (focus)="ValidateParent()" (keyup.tab)="test()" (keyup)="EmitValues($event)" [id]="setId"
  [matAutocomplete]="auto" [title]="selValue" [placeholder]='WaterMarkText'>


<div [hidden]="IsCascading">
  <mat-autocomplete [id]="collectionType" #auto="matAutocomplete" (optionSelected)='onChange($event)'>
    <mat-option *ngFor="let items of codeList" [value]="items.text" [attr.data-text]='items.text' [id]="items.value">
      {{items.text}}
    </mat-option>
  </mat-autocomplete>
</div>

Angular Material 在 tab 选择方面存在问题。例如在单击 tab 按钮时 Material 自动完成无法选择值。但它在单击 enter 按钮时有效。因此,我需要手动覆盖 tab 键事件上的 enter 键事件。怎么可能?

最佳答案

改进我的评论,并根据响应创建指令

import {
    Directive,
    AfterViewInit,
    OnDestroy,
    Optional
} from '@angular/core';
import {
    MatAutocompleteTrigger
} from '@angular/material';


@Directive({
    selector: '[tab-directive]'
})
export class TabDirective implements AfterViewInit, OnDestroy {
    observable: any;
    constructor(@Optional() private autoTrigger: MatAutocompleteTrigger) {}
    ngAfterViewInit() {
        this.observable = this.autoTrigger.panelClosingActions.subscribe(x => {
            if (this.autoTrigger.activeOption) {
                this.autoTrigger.writeValue(this.autoTrigger.activeOption.value)
            }
        })
    }
    ngOnDestroy() {
        this.observable.unsubscribe();
    }
}

您使用:

<input tab-directive type="text" matInput [formControl]="myControl" 
      [matAutocomplete]="auto" >

(参见 stackblitz)

更新 我们只能控制tab.key,否则总是你关闭,你得到选择的值,所以

@Directive({
    selector: '[tab-directive]'
})
export class TabDirective {
    observable: any;
    constructor(@Optional() private autoTrigger: MatAutocompleteTrigger) {}

    @HostListener('keydown.tab', ['$event.target']) onBlur() {
        if (this.autoTrigger.activeOption) {
            this.autoTrigger.writeValue(this.autoTrigger.activeOption.value)
        }
    }

}

(see a new stackblitz)

更新 2 我不相信这个答案有这么多赞成票,因为它是错误的。正如@Andrew allen 评论的那样,该指令不会更新控件。好吧,已经晚了,但我会尽力解决。一种选择是使用

this.autoTrigger._onChange(this.autoTrigger.activeOption.value)

另一个想法是注入(inject) ngControl,所以

constructor(@Optional() private autoTrigger: MatAutocompleteTrigger,
    @Optional() private control: NgControl) {}
ngAfterViewInit() {
    this.observable = this.autoTrigger.panelClosingActions.subscribe(x => {
        if (this.autoTrigger.activeOption) {
            const value = this.autoTrigger.activeOption.value;
            if (this.control)
                this.control.control.setValue(value, {
                    emit: false
                });
            this.autoTrigger.writeValue(value);
        }
    })
}

关于html - 如何在 Angular Material 中将 Tab 键设为回车键?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55156541/

相关文章:

Jquery点击html标签时触发两次事件

html - 在 div 元素中使用 span 元素可以吗?

javascript - Youtube 视频作为着陆页的背景

不同用户的 Angular 路由 View

c# - 尝试触发事件时出现 NullReferenceException

php - Laravel Observers - 有什么方法可以传递额外的参数吗?

html - 悬停和下拉子菜单

javascript - 如何在 Material UI 自动完成中仅显示无选项文本

angular - 在 Angular 页面中显示 Angular 代码和 HTML(未解析)

javascript - In Angular2 With Bootstrap - Tooltip, Tooltip Need setup by executing javascript, 怎么做?