Angular使用ControlValueAccessor创建自定义表单控件
在 angular 自定义表单控件,有时你想要的输入不是标准的文本输入、选择或复选框。通过实现controlvalueaccessor 接口并将组件注册为 ng_value_accessor,您可以将自定义表单控件无缝地集成到模板驱动或响应表单中,就像它是本地表单一样!
controlvalueaccessor
controlvalueaccessor 是一个接口,充当angular api 和 dom 元素之间的桥梁
controlvalueaccessor 是一个连接表单模型和视图(dom元素)的接口,自定义的表单控件必须实现这个接口,它的作用是:
- 把 form 模型中值映射到视图中
- 当视图发生变化时,通知 form directives 或 form controls
angular 引入这个接口的原因是,不同的输入控件数据更新方式是不一样的。例如,对于我们常用的文本输入框来说,我们是设置它的 value 值,而对于复选框 (checkbox) 我们是设置它的 checked 属性。实际上,不同类型的输入控件都有一个 controlvalueaccessor,用来更新视图
angular 中常见的 controlvalueaccessor 有:
- defaultvalueaccessor - 用于 text 和 textarea 类型的输入控件
- selectcontrolvalueaccessor - 用于 select 选择控件
- checkboxcontrolvalueaccessor - 用于 checkbox 复选控件
export interface controlvalueaccessor { writevalue(obj: any) : void registeronchange(fn: any) : void registerontouched(fn: any) : void }
writevalue(obj:any)是将表单模型中的值写入视图中。
writevalue(value: any): void { this._renderer.setproperty(this._elementref.nativeelement, 'value', value); }
registeronchange(fn:any)是一个方法,用于注册在视图中的某些内容发生更改时应调用的处理程序。它获取一个函数,告诉其他表单指令和表单控件更新其值。
registeronchange(fn: (_: any) => void): void { this._onchange = fn; }
registerontouched(fn:any)与registeronchange()此类似,它专门为控件接收触摸事件时注册一个处理程序。
registerontouched(fn: any): void { this._ontouched = fn; }
setdisabledstate?(isdisabled: boolean): void; 是一个可选的方法,设置自定义表单的状态
setdisabledstate(isdisabled: boolean): void { this._renderer.setproperty(this._elementref.nativeelement, 'disabled', isdisabled); }
abstractvalueaccessor
我们可以把 controlvalueaccessor 中的方法写在一个抽象类中,不同的组件可以实现这个基类
export abstract class abstractvalueaccessor implements controlvalueaccessor { private _value: any = ''; get value(): any { return this._value; } set value(v: any) { if (v !== this._value) { this._value = v; this.onchange(v); this.ontouched(); } } writevalue(value: any) { this._value = value; } onchange = (_) => {}; ontouched = () => {}; registeronchange(fn: (_: any) => void): void { this.onchange = fn; } registerontouched(fn: () => void): void { this.ontouched = fn; } } export function makeprovider(type: any): { provide: any, useexisting: any, multi: boolean} { return { provide: ng_value_accessor, useexisting: forwardref(() => type), multi: true }; }
example
自定义一个 list 控件,可以选择年级
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
下一篇: 你知道孕妇什么时候吃燕窝最合适吗
推荐阅读
-
angular4自定义表单控件[(ngModel)]的实现
-
Angular使用ControlValueAccessor创建自定义表单控件
-
C#创建自定义控件及添加自定义属性和事件使用实例详解
-
浅析Angular19 自定义表单控件
-
解决angular 使用原生拖拽页面卡顿及表单控件输入延迟问题
-
angular4自定义表单控件[(ngModel)]的实现
-
从零开始的WTL入门教程(7) 创建使用自定义资源控件,使用DDX,自定义DDX
-
在Angular19中有关自定义表单控件使用
-
Angular使用ControlValueAccessor创建自定义表单控件
-
Angular使用总结 ---以密码确认为例实现模版驱动表单的自定义校验