单击 matPrefix/matSuffix 时如何防止 matInput 聚焦?
How to prevent matInput from focusing when clicking on matPrefix/matSuffix?
我正在尝试实现一个计数器表单域。它有两个按钮;一种用于递增计数值,另一种用于递减计数值。到目前为止,实施非常简单。
<mat-form-field>
<button matPrefix mat-icon-button (click)="onDecrement()">
<mat-icon svgIcon="remove"></mat-icon>
</button>
<input type="number" matInput [formControl]="counter">
<button matSuffix mat-icon-button (click)="onIncrement()">
<mat-icon svgIcon="add"></mat-icon>
</button>
<mat-error *ngIf="counter.errors?.['min']">...</mat-error>
</mat-form-field>
但是,例如,当我单击 matSuffix
增量按钮时,matInput
会自动获得焦点。这会触发键盘在移动浏览器上向上滑动,并在视口随之抖动时让用户感到沮丧。我该如何防止这种行为?
我尝试制作自定义指令以应用于按钮但无济于事。我也尝试将计数器实现为自定义 MatFormFieldControl
,但它有其自身的问题,因此这种方法是行不通的。
我能找到的唯一与我的问题相关的资源是 GitHub issue。根据它,我应该将 $event
绑定到 onDecrement()
和 onIncrement()
方法上,然后在绑定的事件对象上调用 .stopPropagation()
。有效!按递增和递减按钮时不再显示键盘。
我使用该方法的唯一问题是,现在当 counter
值低于最小 Validators.min
约束时,mat-error
消息不会显示。因此,GitHub 讨论中提出的“解决方案”对于我的用例来说确实是一个损坏的可访问性问题。
如何在 matPrefix
上的 pressing/clicking 和 mat-form-field
内的 matSuffix
时防止 matInput
获得焦点,同时不影响上述可访问性问题?
当你使用
input.value = '';
您唯一要做的就是更改 DOM(但不是控件的值)
由于错误仅在触摸“FormControl”时显示,此外使用 setValue 赋值,您应该“手动”将其标记为 Touched
onDecrement(evt:any){
this.counter.setValue((+this.counter.value)-1)
this.counter.markAsTouched()
evt.stopPropagation();
}
onIncrement(evt:any){
this.counter.setValue((+this.counter.value)+1)
this.counter.markAsTouched()
evt.stopPropagation();
}
我正在尝试实现一个计数器表单域。它有两个按钮;一种用于递增计数值,另一种用于递减计数值。到目前为止,实施非常简单。
<mat-form-field>
<button matPrefix mat-icon-button (click)="onDecrement()">
<mat-icon svgIcon="remove"></mat-icon>
</button>
<input type="number" matInput [formControl]="counter">
<button matSuffix mat-icon-button (click)="onIncrement()">
<mat-icon svgIcon="add"></mat-icon>
</button>
<mat-error *ngIf="counter.errors?.['min']">...</mat-error>
</mat-form-field>
但是,例如,当我单击 matSuffix
增量按钮时,matInput
会自动获得焦点。这会触发键盘在移动浏览器上向上滑动,并在视口随之抖动时让用户感到沮丧。我该如何防止这种行为?
我尝试制作自定义指令以应用于按钮但无济于事。我也尝试将计数器实现为自定义 MatFormFieldControl
,但它有其自身的问题,因此这种方法是行不通的。
我能找到的唯一与我的问题相关的资源是 GitHub issue。根据它,我应该将 $event
绑定到 onDecrement()
和 onIncrement()
方法上,然后在绑定的事件对象上调用 .stopPropagation()
。有效!按递增和递减按钮时不再显示键盘。
我使用该方法的唯一问题是,现在当 counter
值低于最小 Validators.min
约束时,mat-error
消息不会显示。因此,GitHub 讨论中提出的“解决方案”对于我的用例来说确实是一个损坏的可访问性问题。
如何在 matPrefix
上的 pressing/clicking 和 mat-form-field
内的 matSuffix
时防止 matInput
获得焦点,同时不影响上述可访问性问题?
当你使用
input.value = '';
您唯一要做的就是更改 DOM(但不是控件的值)
由于错误仅在触摸“FormControl”时显示,此外使用 setValue 赋值,您应该“手动”将其标记为 Touched
onDecrement(evt:any){
this.counter.setValue((+this.counter.value)-1)
this.counter.markAsTouched()
evt.stopPropagation();
}
onIncrement(evt:any){
this.counter.setValue((+this.counter.value)+1)
this.counter.markAsTouched()
evt.stopPropagation();
}