import {Directive, ElementRef, forwardRef, HostListener, Renderer2} from '@angular/core'; import {ControlValueAccessor, NG_VALUE_ACCESSOR} from '@angular/forms'; export const DATE_VALUE_ACCESSOR: any = { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => DateValueAccessor), multi: true }; /** * The accessor for writing a value and listening to changes on a date input element * * ### Example * `` */ @Directive({ // this selector changes the previous behavior silently and might break existing code // selector: 'input[type=date][formControlName],input[type=date][formControl],input[type=date][ngModel]', // this selector is an opt-in version selector: '[useValueAsDate]', providers: [DATE_VALUE_ACCESSOR] }) export class DateValueAccessor implements ControlValueAccessor { @HostListener('input', ['$event.target.valueAsDate']) onChange = (_: any) => { }; @HostListener('blur', []) onTouched = () => { }; constructor(private _renderer: Renderer2, private _elementRef: ElementRef) { } writeValue(value: Date): void { if (!value) { this._renderer.setProperty(this._elementRef.nativeElement, 'value', null); return; } this._renderer.setProperty(this._elementRef.nativeElement, 'valueAsDate', value); } 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); } }