What is ControlValueAccessor? Why do you need to use ? The following article will introduce you to the ControlValueAccessor component interface in Angular. I hope it will be helpful to you!
Simply put, ControlValueAccessor is an interface, which is used to create a bridge between Angular's FormControl instance and native DOM elements. Its usage is similar to OnInit, requiring programmers to implement corresponding methods in custom components.
import { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms'; @Component({ selector: 'custom', templateUrl: './custom.component.html', styleUrls: ['./custom.component.less'], providers: [ { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => CustomComponent), multi: true } ] }) export class CustomComponent implements ControlValueAccessor, OnInit, {…
Sometimes, you may need to create a custom form element and hope that it will work with Angular's FormControl communication. At this time you need ControlValueAccessor to achieve this purpose.
For example:
this.myForm = new FormGroup({ userName: new FormControl({value: '', disabled: false}) });
The use of ControlValueAccessor is introduced on the Angular official website and many articles , but how exactly does it work?
Angular needs a common mechanism to bridge native/custom form controls and formControl directives, and this is exactly what ControlValueAccessor does. This object bridges native form controls and formControl directives and synchronizes their values. Any component or directive can be converted into an object of type ControlValueAccessor by implementing the ControlValueAccessor interface and registering it as NG_VALUE_ACCESSOR.
In fact, native form controls also have interfaces similar to ControlValueAccessor. For example: when Angular encounters input or textarea DOM native controls in the component template, it will use the DefaultValueAccessor directive
Accessor |
##Form Element |
DefaultValueAccessor |
##input,textarea
|
input[type=checkbox] | |
input[type=radio] |
|
input[type=range] |
|
select |
|
select[multiple] |
以上是Angular 为所有原生 DOM 表单元素创建的 Angular 表单控件,即内置ControlValueAccessor ControlValueAccessor 接口定义了四个方法:
formControl 指令使用 writeValue 方法设置原生表单控件的值;使用 registerOnChange 方法来注册由每次原生表单控件值更新时触发的回调函数,我们需要把更新的值传给这个回调函数,这样对应的 Angular 表单控件值也会更新;使用 registerOnTouched 方法来注册用户和控件交互时触发的回调。 formControl会调用名为setUpControl的函数,ControlValueAccessor的实例valueAccessor会被作为参数传入这个函数中。在setUpControl中,ControlValueAccessor的四个方法会在交互时被调用,以完成formControl和元素之间的通信。 拓展:在使用ControlValueAccessor时需要一同引入NG_VALUE_ACCESSOR,它是使用InjectionToken 创建的可在 Provider 中使用的 Token。我们在编写自己的项目时一般不需要用到InjectionToken,但是在一个框架或者第三方的插件中,它就变得十分有必要了。 export const NG_VALUE_ACCESSOR = new InjectionToken<readonlyarray>>('NgValueAccessor');</readonlyarray> Copy after login 试想当我使用依赖注入的功能时,我需要将我创建的依赖注册进组件中。这时我就需要一个令牌,如果我使用一个字符串作为令牌就有可能会造成重复,相同的令牌会导致后面的覆盖前面的。所以需要一个Token作为一个唯一值来防止这种冲突。 providers: [{ provide: TOKEN, useValue: … }] Copy after login 更多编程相关知识,请访问:编程视频!! |
The above is the detailed content of Detailed explanation of the ControlValueAccessor interface of Angular learning. For more information, please follow other related articles on the PHP Chinese website!