import { Directive, ElementRef, HostListener } from '@angular/core'; import { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms'; import { setIonicClasses } from './util/set-ionic-classes'; @Directive({ /* tslint:disable-next-line:directive-selector */ selector: 'ion-checkbox,ion-toggle', providers: [ { provide: NG_VALUE_ACCESSOR, useExisting: BooleanValueAccessor, multi: true } ] }) export class BooleanValueAccessor implements ControlValueAccessor { constructor(private element: ElementRef) { this.onChange = () => {/**/}; this.onTouched = () => {/**/}; } onChange: (value: any) => void; onTouched: () => void; private lastValue: any; writeValue(value: any) { this.element.nativeElement.checked = this.lastValue = value; setIonicClasses(this.element); } @HostListener('ionChange', ['$event.target.checked']) _handleIonChange(value: any) { if (value !== this.lastValue) { this.lastValue = value; this.onChange(value); } requestAnimationFrame(() => { setIonicClasses(this.element); }); } @HostListener('ionBlur') _handleBlurEvent() { this.onTouched(); requestAnimationFrame(() => { setIonicClasses(this.element); }); } registerOnChange(fn: (value: any) => void) { this.onChange = fn; } registerOnTouched(fn: () => void) { this.onTouched = fn; } setDisabledState(isDisabled: boolean) { this.element.nativeElement.disabled = isDisabled; } }