• [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();
      }
    }
  • 相关阅读:
    关于cocoapods中的一些报错解决方案
    基于 声网Agora SDK 实现 iOS 端的多人音视频互动
    AppStore中使用IDFA后提交应用的注意事项
    iOS打包测试和发布
    LLDB常用调试命令
    MRC与ARC区别以及五大内存区
    关于友盟分享和微信支付冲突的解决办法
    iOS开发集成支付宝支付、支付宝&微信支付
    关于iOS引导页图层的相关属性类
    遇见的奇葩问题
  • 原文地址:https://www.cnblogs.com/Answer1215/p/7385526.html
Copyright © 2020-2023  润新知