zoukankan      html  css  js  c++  java
  • [Angular] Implement a custom form component by using control value accessor

    We have a form component:

              <label>
                <h3>Type</h3>
                <workout-type
                  formControlName="type"
                ></workout-type>
              </label>
    
    
      form = this.fb.group({
        name: ['', Validators.required],
        type: 'strength'
      });
    
      constructor(
        private fb: FormBuilder
      ) {}

    the 'type' FormControl will be a custom form element component which refers to 'workout-type' componet.

    For the workout-type component:

    import {ChangeDetectionStrategy, Component, forwardRef} from '@angular/core';
    import {ControlValueAccessor, NG_VALUE_ACCESSOR} from '@angular/forms';
    
    // Register the control value accessor
    
    export const TYPE_CONTROL_ACCESSOR = {
      provide: NG_VALUE_ACCESSOR,
      multi: true,
      useExisting: forwardRef(() => WorkoutTypeComponent)
    };
    
    @Component({
      selector: 'workout-type',
      providers: [TYPE_CONTROL_ACCESSOR],
      changeDetection: ChangeDetectionStrategy.OnPush,
      styleUrls: ['workout-type.component.scss'],
      template: `
        <div class="workout-type">
          <div 
            *ngFor="let selector of selectors"
            [class.active]="selector === value"
            (click)="setSelected(selector)"
            class="workout-type__pane">
            <img src="/img/{{selector}}.svg" alt="{{selector}}">
            <p>
              {{selector}}
            </p>
          </div>
        </div>
      `
    })
    export class WorkoutTypeComponent implements ControlValueAccessor{
    
      selectors = ['strength', 'endurance'];
      private onTouch: Function;
      private onModelChange: Function;
      private value: string;
    
      constructor() {
    
      }
    
      writeValue(value: string): void {
        this.value = value;
      }
    
      registerOnChange(fn: Function): void {
        this.onModelChange = fn;
      }
    
      registerOnTouched(fn: Function): void {
        this.onTouch = fn;
      }
    
      setSelected(value: string): void {
        this.value = value;
        this.onModelChange(value);
        this.onTouch();
      }
    }
  • 相关阅读:
    【BZOJ1858】序列操作(SCOI2010)-线段树
    【BZOJ1858】序列操作(SCOI2010)-线段树
    【SPOJ3267】D-query-莫队算法
    【BZOJ2038】小Z的袜子(2009国家集训队)-莫队算法
    【BZOJ2038】小Z的袜子(2009国家集训队)-莫队算法
    【HDU3966】Aragorn's Story-树链剖分或LCT维护路径
    BZOJ 4569 萌萌哒
    BZOJ 2460 元素
    BZOJ 2115 Xor
    BZOJ 2750 Road
  • 原文地址:https://www.cnblogs.com/Answer1215/p/7385526.html
Copyright © 2011-2022 走看看