Angular 4+: Custom validator AND native min/max arrow selection
我正在尝试添加动态的最小/最大验证器指令,以防止基于模板的[min]和[max]值手动输入错误值以及使用向上/向下箭头。
当手动输入值时,它可以完美工作,并显示错误。但是我失去了本能防止使用输入的向上/向下箭头键入错误数字的行为...
html示例:
1 | <input name="ph" type="number" [(ngModel)]="plotData.soilCharacteristics.ph.value" ngFormMinMax [min]="defaultPlotParameters.soil.ph.min" [max]="defaultPlotParameters.soil.ph.max"/> |
指令代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | @Directive({ selector: '[ngFormMinMax]', providers: [{ provide: NG_VALIDATORS, useExisting: WfNgMinMaxDirective, multi: true }] }) export class WfNgMinMaxDirective implements Validator { @Input() ngModel: NgModel; _min: number; @Input() set min(value: number) { this._min = value; } _max: number; @Input() set max(value: number) { this._max = value; } validate(control: AbstractControl): ValidationErrors | null { if (control.value > this._max) { return { max: { invalid: true } }; } if (control.value < this._min) { return { min: { invalid: true } }; } return null; } } |
行为:
将[max]值设置为10,我可以手动输入11并显示错误,但是我也可以使用输入的向上/向下箭头转到11。删除指令时,向上/向下键被锁定为10,如预期的那样,但是我丢失了手动验证...
似乎向上/向下键的默认行为已被覆盖,有没有办法防止这种情况?我以为使用NG_VALIDATORSproviders是做到这一点的方法?
谢谢
我已使用带有窗体控制和自定义验证程序的反应性窗体实现了验证。我们需要存储最后一个成功值,并且需要在UI中对其进行更新。
https://stackblitz.com/edit/angular-homnk5?file=src/app/app.component.ts
在模板中,您可以使用name.errors?.invalid
显示错误消息。
试试这个
1 | [attr.min]="defaultPlotParameters.soil.ph.min" |
这是基于我生产代码中的内容,但是您必须对其进行修改:
1 2 3 4 5 6 | @HostListener('keydown', ['$event']) public keydown(event: any): void { // Check for the value of the key pressed; if it is // the up or down keys then trigger the validation manually. this.form.updateValueAndValidity(); } |
这可能会帮助您找到特定于代码的解决方案。