Angular使用ControlValueAccessor创建自定义表单控件
在 Angular 自定义表单控件,有时你想要的输入不是标准的文本输入、选择或复选框。通过实现ControlValueAessor 接口并将组件注册为 NG_VALUE_ACCESSOR,您可以将自定义表单控件无缝地集成到模板驱动或响应表单中,就像它是本地表单一样!
ControlValueAessor
ControlValueAessor 是一个接口,充当Angular API 和 DOM 元素之间的桥梁
ControlValueAessor 是一个连接表单模型和视图(DOM元素)的接口,自定义的表单控件必须实现这个接口,它的作用是
- 把 form 模型中值映射到视图中
- 当视图发生变化时,通知 form directives 或 form controls
Angular 引入这个接口的原因是,不同的输入控件数据更新方式是不一样的。例如,对于我们常用的文本输入框来说,我们是设置它的 value 值,而对于复选框 (checkbox) 我们是设置它的 checked 属性。实际上,不同类型的输入控件都有一个 ControlValueAessor,用来更新视图
Angular 中常见的 ControlValueAessor 有
- DefaultValueAessor - 用于 text 和 textarea 类型的输入控件
- SelectControlValueAessor - 用于 select 选择控件
- CheckboxControlValueAessor - 用于 checkbox 复选控件
export interface ControlValueAessor { writeValue(obj: any) : void registerOnChange(fn: any) : void registerOnTouched(fn: any) : void }
writeValue(objany)是将表单模型中的值写入视图中。
writeValue(value: any): void { this._renderer.setProperty(this._elementRef.nativeElement, 'value', value); }
registerOnChange(fnany)是一个方法,用于注册在视图中的某些内容发生更改时应调用的处理程序。它获取一个函数,告诉其他表单指令和表单控件更新其值。
registerOnChange(fn: (_: any) => void): void { this._onChange = fn; }
registerOnTouched(fnany)与registerOnChange()此类似,它专门为控件接收触摸事件时注册一个处理程序。
registerOnTouched(fn: any): void { this._onTouched = fn; }
setDisabledState?(isDisabled: boolean): void; 是一个可选的方法,设置自定义表单的状态
setDisabledState(isDisabled: boolean): void { this._renderer.setProperty(this._elementRef.nativeElement, 'disabled', isDisabled); }
AbstractValueAessor
我们可以把 ControlValueAessor 中的方法写在一个抽象类中,不同的组件可以实现这个基类
export abstract class AbstractValueAessor implements ControlValueAessor { 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 控件,可以选择年级
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持狼蚁SEO。
编程语言
- 甘肃哪有关键词排名优化购买方式有哪些
- 甘肃SEO如何做网站优化
- 河南seo关键词优化怎么做电话营销
- 北京SEO优化如何做QQ群营销
- 来宾百度关键词排名:提升您网站曝光率的关键
- 卢龙关键词优化:提升您网站排名的策略与技巧
- 山东网站优化的注意事项有哪些
- 四川整站优化怎样提升在搜索引擎中的排名
- 疏附整站优化:提升网站性能与用户体验的全新
- 海南seo主要做什么工作售后服务要做到哪些
- 荣昌百度网站优化:提升您网站的搜索引擎排名
- 河北seo网站排名关键词优化如何做SEO
- 江西优化关键词排名推广售后保障一般有哪些
- 古浪SEO优化:提升你的网站可见性
- 西藏网站排名优化怎么把网站排名在百度首页
- 如何提升阳东百度快照排名:详尽指南