From a7a58ae8f306fad1f72110754ed9cccf19fee482 Mon Sep 17 00:00:00 2001 From: Kyle Spearrin Date: Wed, 6 Jun 2018 14:29:59 -0400 Subject: [PATCH] true false value directive --- .../directives/true-false-value.directive.ts | 54 +++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 src/angular/directives/true-false-value.directive.ts diff --git a/src/angular/directives/true-false-value.directive.ts b/src/angular/directives/true-false-value.directive.ts new file mode 100644 index 0000000000..12729b90f1 --- /dev/null +++ b/src/angular/directives/true-false-value.directive.ts @@ -0,0 +1,54 @@ +import { + Directive, + ElementRef, + forwardRef, + HostListener, + Input, + Renderer2, +} from '@angular/core'; +import { + ControlValueAccessor, + NG_VALUE_ACCESSOR, + NgControl, +} from '@angular/forms'; + +// ref: https://juristr.com/blog/2018/02/ng-true-value-directive/ +@Directive({ + selector: 'input[type=checkbox][appTrueFalseValue]', + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => TrueFalseValueDirective), + multi: true, + }, + ], +}) +export class TrueFalseValueDirective implements ControlValueAccessor { + @Input() trueValue = true; + @Input() falseValue = false; + + constructor(private elementRef: ElementRef, private renderer: Renderer2) { } + + @HostListener('change', ['$event']) + onHostChange(ev: any) { + this.propagateChange(ev.target.checked ? this.trueValue : this.falseValue); + } + + writeValue(obj: any): void { + if (obj === this.trueValue) { + this.renderer.setProperty(this.elementRef.nativeElement, 'checked', true); + } else { + this.renderer.setProperty(this.elementRef.nativeElement, 'checked', false); + } + } + + registerOnChange(fn: any): void { + this.propagateChange = fn; + } + + registerOnTouched(fn: any): void { /* nothing */ } + + setDisabledState?(isDisabled: boolean): void { /* nothing */ } + + private propagateChange = (_: any) => { /* nothing */ }; +}