Если вы хотите что-то универсальное, многоразовое и гибкое, вы можете написать для этого директиву, которая захватывает входные события и фильтры при необходимости, например:
@Directive({
selector: 'input[regexInput]',
providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: RegexInputDirective,
multi: true
}
]
})
export class RegexInputDirective implements ControlValueAccessor {
private _regex: RegExp;
@Input()
set regexInput(regex: string | RegExp) {
this._regex = (typeof regex === 'string') ? new RegExp(regex, "g") : regex;
}
constructor(private elementRef: ElementRef<HTMLInputElement>) { }
writeValue(val: any): void { }
onChange = (value: any) => {};
onTouched = () => {};
registerOnChange(fn: (val: any) => void): void {
this.onChange = fn;
}
registerOnTouched(fn: any): void {
this.onTouched = fn;
}
@HostListener('input', ['$event'])
onInput(event: Event) {
if (!this._regex) {
throw new Error('RegExp required for regexInput');
}
let val = (<HTMLInputElement>event.target).value;
let cleanVal = (val.match(this._regex) || []).join("");
this.elementRef.nativeElement.value = cleanVal;
this.onChange(cleanVal);
}
}
довольно прямолинейно, принимает входные данные регулярного выражения, привязывается к событию ввода и запускает сопоставление значения с предоставленным регулярным выражением, которое удалит все недопустимые символы.
Запутанные части могут быть элементами доступа к значению элемента управления ... это просто делает его совместимым с элементами управления формой и моделью ng и т. Д.
используйте как:
<input type="text" regexInput="[A-Za-z0-9]*">