У нас есть поле ввода на веб-странице, которое должно быть обрезано в то время, когда пользователь вводит эти данные. Поскольку входные данные привязаны к угловой форме, значение в форме также должно быть обрезано.
Я использую Angular 7
import {
Directive,
ElementRef,
forwardRef,
HostListener,
Input,
Renderer2
} from "@angular/core";
import {
ControlValueAccessor,
NG_VALUE_ACCESSOR
} from "@angular/forms";
@Directive({
selector: "[ebppInputTextTrimmer]",
providers: [{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => InputTextTrimmerDirective),
multi: true
}]
})
export class InputTextTrimmerDirective implements ControlValueAccessor {
@Input() prevVal: string;
@Input() isTrimEnabled: boolean;
onChange = (_: any) => {
}
onTouched = () => {
}
constructor(
private _renderer: Renderer2,
private _elementRef: ElementRef) {
}
writeValue(value: any): void {
const normalizedValue = value == null ? "" : value;
this._renderer.setProperty(this._elementRef.nativeElement, "value", normalizedValue);
}
registerOnChange(fn: (_: any) => void): void {
this.onChange = fn;
}
registerOnTouched(fn: () => void): void {
this.onTouched = fn;
}
setDisabledState(isDisabled: boolean): void {
this._renderer.setProperty(this._elementRef.nativeElement, "disabled", isDisabled);
}
@HostListener("input", ["$event.target.value"])
handleInput(inputValue: any): void {
let valueToProcess = inputValue;
if (this.isTrimEnabled) {
valueToProcess = inputValue.trim();
}
this.onChange(valueToProcess);
// set the value that is trimmed in the view
this._renderer.setProperty(this._elementRef.nativeElement, "value", valueToProcess);
}
}
Показанный код отлично работает для меня. Интересно, есть ли более простое решение?