本文简单介绍封装使用ngModel实现自定义表单控件的过程。

NgModel 相关

NgModel

NgModel用于从作用域创建一个FormControl实例,并将它绑定到一个表单控件元素。

ngModel继承自NgControl

NgControl

NgControl是所有控制指令继承的基础类。它将一个FormControl绑定到DOM元素中。

FormControlFormGroupFormArray,三者都用于angular表单的值和状态的跟踪,区别是一个控件、一组控件或者是它们的组合。

FormControl用于跟踪一个单独的表单控件的值和有效性状态。它对应一个HTML表单控件,不如输入框和下拉框。 FormGroup用于跟踪一组AbstractControl的实例的值和有效性状态。该组的属性中包含了它的子控件。组件中的顶级表单就是一个FormGroupFormArray用于跟踪AbstractControl实例组成的有序数组的值和有效性状态。

ControlValueAccessor

ControlValueAccessor用于在控制和原生元素之间建立联系,它封装了赋值到一个表现为input元素的DOM元素。

简单说,就是angular中的input是带有[(ngModel)]这个属性的,而我们想要自己控制这个input的写入过程,使用ControlValueAccessor就可以做到。

ControlValueAccessor提供以下接口:

  • writeValue(obj: any) : void: 写入值到元素
  • registerOnChange(fn: any) : void: 设置当控件接收到change事件时触发的回调
  • registerOnTouched(fn: any) : void: 设置当控件接收到touch事件时触发的回调
  • setDisabledState(isDisabled: boolean) : void: 该函数将在控件状态或者disabled值变化,根据值来对元素启用或失效

DefaultValueAccessor

DefaultValueAccessor提供值写入和监听变化的默认访问,像NgModel, FormControlDirective, 和FormControlName指令会使用。

DefaultValueAccessor提供类包括:

  • onChange : (_: any) => {} change事件变化监听
  • onTouched : () => {} touch事件变化监听

以及ControlValueAccessor(上面)的接口。

NG_VALUE_ACCESSOR

NG_VALUE_ACCESSOR提供一个ControlValueAccessor供表单控制使用。

创建自定义input控件

我们想要封装后的组件跟原生的angular组件一样,像表现为input的自定义控件,我们想要使用[(ngModel)]来进行双向绑定,我们需要使用ControlValueAccessor来拓展。

而这里ControlValueAccessor只是一个接口,我们应用它,还需要获取一些可用的服务,这时候需要注入NG_VALUE_ACCESSOR

{provide: NG_VALUE_ACCESSOR,useExisting: forwardRef(() => CustomInputComponent),multi: true
};
复制代码

这里简单讲讲几个概念:

  • 我们自定义了一个访问控制服务,该服务包装为NG_VALUE_ACCESSOR服务,主要用于控制ControlValueAccessor相关的访问。
  • 我们需要将自定义input控件提供给NG_VALUE_ACCESSOR,以便通过自定义方式控制父组件的[(ngModel)]以及其他表单相关的访问。
  • forwardRef用于将目前还未获取到的依赖关联起来,这里我们关联后面的自定义Input组件。
@Component({selector: 'app-custom-input',templateUrl: './custom-input.component.html',styleUrls: ['./custom-input.component.css'],providers: [{provide: NG_VALUE_ACCESSOR,useExisting: forwardRef(() => CustomInputComponent),multi: true}]
})
export class CustomInputComponent implements OnInit, ControlValueAccessor {/** 自定义表单控件* 需要完成ControlValueAccessor内部的方法* */private _custom: any = '';// 定义ControlValueAccessor提供的事件回调private onChange = (_: any) => {};get custom(): any {return this._custom;}set custom(v: any) {if (v !== this._custom) {this._custom = v;this.onChange(this._custom);}}constructor() {}ngOnInit() {}writeValue(val: any): void {this._custom = val;}registerOnChange(fn: any): void {this.onChange = fn;}registerOnTouched(fn: any): void {}}复制代码

具体的实现实例参考Angular2 + Connect custom component to ngModel。

Angular学习笔记(五) - 自定义表单控件相关推荐

  1. html学习笔记之一:表单控件

    一.表单元素<form></form> 主要属性 1)action : 属性值是URL,规定当提交表单时应该思想何处提交数据,为空时表示在当前页面操作: 2)method :表 ...

  2. Angular 4.x 自定义表单控件

    当我们打算自定义表单控件前,我们应该先考虑一下以下问题: 是否已经有相同语义的 native (本机) 元素?如:<input type="number"> 如果有,我 ...

  3. Angular: [ControlValueAccessor] 自定义表单控件

    Angular: [ControlValueAccessor] 自定义表单控件 我们在实际开发中,通常会遇到各种各样的定制化功能,会遇到有些组件会与 Angular 的表单进行交互,这时候我们一般会从 ...

  4. 细说 Angular 的自定义表单控件

    我们在构建企业级应用时,通常会遇到各种各样的定制化功能,因为每个企业都有自己独特的流程.思维方式和行为习惯.有很多时候,软件企业是不太理解这种情况,习惯性的会给出一个诊断,『你这么做不对,按逻辑应该这 ...

  5. 细说 Angular 的自定义表单控件 (赞,实用、日期组件)

    原文出处:https://m.imooc.com/article/19369  (应该是<Angular从零到一>作者) 我们在构建企业级应用时,通常会遇到各种各样的定制化功能,因为每个企 ...

  6. Angular19 自定义表单控件

    1 需求 当开发者需要一个特定的表单控件时就需要自己开发一个和默认提供的表单控件用法相似的控件来作为表单控件:自定义的表单控件必须考虑模型和视图之间的数据怎么进行交互 2 官方文档 -> 点击前 ...

  7. vb.net form 最大化按钮 代码_【React】利用antd的form自定义表单控件

    由于业务的需求,需要对Form表单进行自定义控件操作 业务需求如下: 首先点击选择按钮---在弹窗中选择产品--将选择好的产品展示在页面上,关于自定义组件的封装网上大牛的方法大多是封装好新的组件,从而 ...

  8. Antd Form 自定义表单控件

    首先我们直接在自定义组件中打印看一下props能得到什么: 可以看到Form.Item向我们的自定义组件内部传递了一个value和一个onChange事件 那么我们可以在自己定义的组件内部维护好一个s ...

  9. 我教女朋友学编程Html系列(6)—Html常用表单控件

    做过网页的人都知道,html表单控件十分重要.基本上我们注册会员.登录用户,都需要填写用户名.密码,那些框框都是表单控件. 本来今天就想写一些常用的html表单控件,于是开始搜资料,找到了一个网页,作 ...

最新文章

  1. 简历英文 计算机水平,计算机英文 简历
  2. server vscode中的live_VSCode 建议你启用 gopls,它到底是个什么东东?
  3. 【NLP】基于GloVe词向量的迁移学习
  4. java插入时间 mssql_JAVA操作数据库Datetime数据
  5. SAP CRM CRM_PARTNER_READ_MULTI_OB
  6. win8下cocos2dx3.2移植android平台及代码打包APK
  7. Existing lock /var/run/yum.pid: another copy is running as pid
  8. 7月国内手机出货量3419.9万部 5G手机果然还是很少!
  9. 修改joomla!底部版权信息的方法
  10. 在计算机网络中通常所说的wlan是指,在计算机网络中,通常所说的WLAN是指()。 - 问答库...
  11. Appium原理初步--Android自动化测试学习历程
  12. flask-script插件
  13. 开心网游戏界面Html
  14. 从游击队到正规军(三):基于Go的马蜂窝旅游网分布式IM系统技术实践
  15. 孙玄:一文完全理解定时器实现技术
  16. android toast 怎么用,Android学习 Android Toast的使用
  17. 基于OpenGL的3D天空仿真
  18. 关于2021年11月28日PMI认证考试的报名通知
  19. iPhone X适配之启动图适配教程
  20. jquery的优势是什么?

热门文章

  1. 高效通信模型之 - 异步通信模型
  2. 引用: 编写高性能 Web 应用程序的10个技巧
  3. 看看junit在一个具体的项目中
  4. 15.2. 网络监控
  5. 【LeetCode题解】排序
  6. windows/linuxjdk安装,jdk1.6升级到1.7
  7. 2012、12、17
  8. Python sys 使用说明
  9. 深入理解JavaScript系列(21):S.O.L.I.D五大原则之接口隔离原则ISP
  10. 巧用ASP.NET预编译Web应用程序规避调用延迟,徐汇区网站设计