Angular中的ControlValueAccessor用法 之 自定义组件关联formControlName

当项目中存在大量的某个相同的表单项,如果你一个一个重复写费劲了…
在某期迭代需求开发时,产品告知你:来!整个项目都给我加一个xxx筛选框
又或者学习过程中你不熟悉文档中ControlValueAccessor的用法…
来,看这篇文章,保!你!懂!

1.适用场景:

form表单中,想把某个表单项(input,select,radio,checkbox等等~)拎出来作为单独的组件使用,但不想使用父子组件传参的那种方式,并且仍想使用formControlName

如果,曾经,上述的这种逻辑触及到了我们的知识盲区,想必一定会送三个字:想得美
可是,现在,不同了!我们开始学习他,攻克她,掌握它

2.相关知识文档

敲黑板!
首要查询的当然是官方文档喽,具体说明以及方法均已框框的形式重点标出!
在这里插入图片描述
其次么,那就打开node_modules 查看ng-zorro-antd文件夹下的bundles文件夹下边的文件喽(模仿怎么写~~balabalabala~)

在这里插入图片描述

3.喊你抄作业啦~~~~~~如何使用

首先是独立组件的书写:
HTML

<nz-select
  [nzPlaceHolder]="nzPlaceHolder"
  [ngModel]="nzValue"
  [disabled]="nzDisabled"
  (ngModelChange)="handleChange($event)"
>
  <nz-option nzValue="" nzLabel="全部"></nz-option>
  <nz-option
    *ngFor="let item of Options"
    [nzValue]="item.id"
    [nzLabel]="item.name"
  ></nz-option>
</nz-select>

TS

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

type OnChangeType = (value: number | string) => void;
type OnTouchedType = () => any;

@Component({
  selector: 'app-search-name',
  templateUrl: './search-name.component.html',
  styleUrls: ['./search-name.component.scss'],
  providers: [
    {
      useExisting: forwardRef(() => SearchNameComponent),
      provide: NG_VALUE_ACCESSOR,
      multi: true,
    },
  ],
})
export class SearchNameComponent implements OnInit, ControlValueAccessor {
  @Input() nzValue: number | string; // 默认的初始值
  @Input() nzDisabled = false; // 默认的灰显状态-不灰显
  @Input() nzPlaceHolder: string;

  loading = false;
  Options = []; // 枚举列表(请求接口拿,这里省略该逻辑代码)
  onChange: OnChangeType = () => {};
  onTouched: OnTouchedType = () => {};

  constructor() {}

  ngOnInit() {
    // 请求select的枚举列表数据
    // this.Options  = xxx
  }
  
  // ControlValueAccessor的四项
  writeValue(value: number | string) {
  // 刷新页面的时候,这个方法是会请求的,也就是说:这里能捕获到使用该组件所绑定的formControlName的当前值并反显
    this.nzValue = value;
  }
  registerOnChange(fn: OnChangeType) {
    this.onChange = fn;
  }
  registerOnTouched(fn: OnTouchedType) {
    this.onTouched = fn;
  }
  setDisabledState(disabled: boolean) {
    this.nzDisabled = disabled;
  }
  // 这里是select的change事件,当值改变时会触发
  handleChange(value) {
    this.nzValue = value;
    // 这里onChange是尤为重要的方法,可以将值传输出去
    this.onChange(this.nzValue);
  }
}

其次,我们就可以在父组件或者其他组件中使用ta啦

   <app-search-name
        formControlName="tempName"
        nzPlaceHolder="请选择xxx"
   ></app-search-name>

这时候,formControlName是真正的绑定自定义组件上了,值变动时也能实时捕获哦

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值