ControlValueAccessor
它是一个接口用于连接表单模型和视图,自定义表单必须实现这个接口,来实现模型与视图的映射关系
Angular引入它的原因在于不同的输入控件更新数据方式不同,input或checkbox,但是可以通过ControlValueAccessor统一
DefaultValueAccessor - text/textarea类型
SelectControlValueAccessor - selec类型
CheckboxControlValueAccessor - checkbox类型
实现ControlValueAccessor接口
1 | export interface ControlValueAccessor { |
1 | @Component(...) |
注册成为表单控件
NG_VALUE_ACCESSOR: token类型为ControlValueAccessor,将控件本身注册到DI框架,使其可以被表单访问
NG_VALIDTORS: 将控件注册成为一个可以让表单得到其验证状态的控件,token为function或Validator,配合useExisting可以让控件只暴露出对应的function或Validator的validate方法
forwardRef: 向前引用,允许我们引用一个尚未定义的对象
multi: 设置为true,该token对应多个依赖项,使用相同的token获取依赖项的时候,获取的是已注册的依赖对象列表。如果不是true,那么对于相同的token的提供商来说,后定义的提供商会覆盖前面定义的
1 | @Component({ |
完整代码
1 | import { Component, forwardRef , Input } from '@angular/core'; |
在Angular中通过Provider来描述与Token相关联的依赖对象的创建方式,分为以下四种
useClass
useValue
useExisting
useFactory
1 | providers: [ |
1 | providers: [ |
1 | providers: [ |
1 | export function configFactory(config: AppConfig) { |