Angular提供了一套非常强大的表单验证库(vue和react都需要第三方库的支持),可以非常方便简单实现web应用程序中的表单验证功能。但是如何让我们自定义的组件也支持验证呢?
我遇到一个需求是封装WangEditor这个富文本编辑器放到表单中。
这种需求是非常常见的,Angular给我们提供了ControlValueAccessor接口,我们可以很方便的实现自定义验证功能
理解ControlValueAccessor
用官方的话来说,ControlValueAccessor是充当 Angular 表单 API 和 DOM 中的原生元素之间的桥梁
这个接口提供了四个方法
interface ControlValueAccessor { writeValue(obj: any): void registerOnChange(fn: any): void registerOnTouched(fn: any): void setDisabledState(isDisabled: boolean)?: void }
一般情况下,只需要处理writeValue
和registerOnChange
两个方法
writeValue是formGroup把值传递给自定义组件,自定义组件需要根据这个值处理对应的显示状态。
registerOnChange的参数是一个Function,需要在组件状态修改的时候,调用这个Function来把组件的值传递给formGroup
注册Provider使当前的接口处理生效
如果是单纯的实现了这个接口,是无法生效的。需要在模块注册或者组件上的Attribute中去注册NG_VALUE_ACCESSOR
值为当前组件。
providers: [{ provide: NG_VALUE_ACCESSOR, useExisting: QWangEditorComponent, multi: true }]
做完这一步后,这个组件就支持了Angular的表单验证功能了。
在表单中,加上formControlName
属性,自定义组件的功能就可以和formGroup
中的对应属性实现双向绑定了,并支持表单验证了。