Angular.js专场Web前端之路让前端飞

【angular】自定义 FormControl

2019-05-22  本文已影响3人  Allan_野草

介绍

angular的表单,先复习一下:https://angular.cn/guide/forms-overview
接下来看,它一般是长这样的:

<form
  nz-form
  [formGroup]="form">

  <nz-form-item>
    <nz-form-label>请选择颜色</nz-form-label>
    <nz-form-control>
      <checkbox formControlName="color">多选组件</checkbox>
    </nz-form-control>
  </nz-form-item>

  ...

</form>

注意到<checkbox />那里,
像input、textarea、nz-select组件,直接指定formControlName,是可以正常工作的。
但假如<checkbox />组件是自定义的,此时,要做特殊处理,如何跟form进行通讯。

如何做

<abc formControlName="color" ngDefaultControl></abc>

代码示例

有注释,实际上也很简单:

import { Component, OnInit, Input } from '@angular/core';
import { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';

@Component({
  selector: 'app-form-checkbox',
  templateUrl: './form-checkbox.component.html',
  providers: [{
    provide: NG_VALUE_ACCESSOR,
    useExisting: AppFormCheckboxComponent,
    multi: true
  }]
})
// 以上代码直接拷回去
// .html自行实现
export class AppFormCheckboxComponent implements ControlValueAccessor {

  value = []; // 组件对应的 “ ngModel ”
  onChangeListener; // 改变值回调
  onTouchedListener; // 交互回调

  constructor() {
  }

  writeValue(obj: any): void {
    this.value = obj; // form中给你设置了obj值,根据obj,去更新组件/UI
  }

  registerOnChange(fn: any): void {
    this.onChangeListener = fn; // 保存这个函数
  }

  registerOnTouched(fn: any): void {
    this.onTouchedListener = fn; // 保存这个函数
  }

  /**
   * 自定义当组件发生改变时,会调用的方法
   */
  onChange(payload) {
    this.value = payload;
    this.onChangeListener(payload); // 告诉form,你的表单值改变成了payload
    this.onTouchedListener(); // 告诉form,你的表单有交互发生
  }

}

参考

也可以参考下这篇文章:https://segmentfault.com/a/1190000014129567

上一篇 下一篇

猜你喜欢

热点阅读