Issue
I have created a custom directive to remove whitespaces from the input box which works completely fine till Angular version 7, but not working in Angular version 9.
import {
Directive,
ElementRef,
Output,
EventEmitter,
} from '@angular/core';
@Directive({
selector: '[trim]',
host: {
'(blur)': 'onBlur()'
}
})
export class TrimDirective {
@Output() ngModelChange: EventEmitter < any > = new EventEmitter();
constructor(private element: ElementRef) {}
onBlur() {
(this.element.nativeElement as HTMLInputElement).value = (this.element.nativeElement as HTMLInputElement).value.trim();
this.ngModelChange.emit((this.element.nativeElement as HTMLInputElement).value.trim());
}
}
On blur event it supposed to trim the whitespaces and update the ngModel, but it’s not updating ngModel
Solution
to update input value they use both setProperty() and setAttribute()
import { Directive, EventEmitter, Input, ChangeDetectorRef, Output, ElementRef, HostListener, Inject, Renderer2 } from '@angular/core';
import { NgModel } from '@angular/forms';
@Directive({
selector: '[appTrim]'
})
export class TrimDirective {
constructor(
private renderer: Renderer2,
private elementRef: ElementRef,
private ngModel: NgModel) { }
@HostListener("blur")
onBlur() {
let value = this.ngModel.model;
if(value) {
value = value.trim();
this.renderer.setProperty(
this.elementRef.nativeElement, "value", value);
this.renderer.setAttribute(
this.elementRef.nativeElement, "value", value);
this.ngModel.update.emit(value);
} else {
this.renderer.setProperty(
this.elementRef.nativeElement, "value", null);
this.renderer.setAttribute(
this.elementRef.nativeElement, "value", null);
this.ngModel.update.emit("");
}
}
}
example link