码迷,mamicode.com
首页 > 数据库 > 详细

[Angular] Create a ng-true-value and ng-false-value in Angular by controlValueAccessor

时间:2018-02-03 12:35:56      阅读:193      评论:0      收藏:0      [点我收藏+]

标签:his   int   api   ons   sdi   imp   pre   listen   from   

If you‘re coming from AngularJS (v1.x) you probably remember the ng-true-value and ng-false-value directive which allowed to map custom boolean values like "yes" or "no" or whatever other value you had, onto your HTML form. In this lesson we‘re going to implement our own trueFalseValue directive for Angular, by directly hooking into Angular‘s form API. A nice occasion to learn about the ControlValueAccessor interface.

 

import { Directive, Input, ElementRef, Renderer2, HostListener, forwardRef } from ‘@angular/core‘;
import { ControlValueAccessor, NG_VALUE_ACCESSOR } from ‘@angular/forms‘;

@Directive({
  selector: ‘input[type=checkbox][trueFalseValue]‘,
  providers: [
    {
      provide: NG_VALUE_ACCESSOR,
      useExisting: forwardRef(() => TrueFalseValueDirective),
      multi: true
    }
  ]
})
export class TrueFalseValueDirective implements ControlValueAccessor {
  @Input() trueValue = true;
  @Input() falseValue = false;
  private propagateChange = (_: any) => { };

  constructor(private elementRef: ElementRef, private renderer: Renderer2) {
  }

  @HostListener(‘change‘, [‘$event‘])
  onHostChange(ev) {
    this.propagateChange(ev.target.checked ? this.trueValue : this.falseValue);
  }

  writeValue(obj: any): void {
    // model -> view
    if (obj === this.trueValue) {
      // this.elementRef.nativeElement.checked = true;
      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 {
  }
  setDisabledState?(isDisabled: boolean): void {
  }
}

 

How to use:

      <input type="checkbox" formControlName="lovingAngular"
        trueFalseValue
        trueValue="yes" falseValue="nope"
        > loving Angular?

 

[Angular] Create a ng-true-value and ng-false-value in Angular by controlValueAccessor

标签:his   int   api   ons   sdi   imp   pre   listen   from   

原文地址:https://www.cnblogs.com/Answer1215/p/8408499.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!