ViewChild和ControlValueAccessor在角度上有什么区别?似乎它们都可以访问子组件、指令、DOM。对用法的差异如此好奇,一个人能做另一个人做不到的事情吗?
发布于 2020-02-11 08:23:50
ControlValueAccesor用于制作自定义窗体控件。
按照步骤,FormControl可以存储任何东西,甚至是一个对象。想象两种不同的FormGroups
form1=new FormGroup({
name:new FormControl('name')
direcction:new FormControl({address:'address',cp:'cp'})
})
form2=new FormGroup({
name:new FormControl('name')
direction:new FormGroup({
address:new FormControl('address'),
cp:new FormControl('cp')
})两者都有相同的“价值”。
{name:'name',direction:{address:'adress',cp:'cp'}}在使用表单数组时,可以使用
form1=new FormGroup({
name:new FormControl('name')
direcction:new FormArray([
new FormControl({address:'address1',cp:'cp1'}),
new FormControl({address:'address2',cp:'cp2'})
]
})
form2=new FormGroup({
name:new FormControl('name')
direction:new FormArray([
FormGroup({
address:new FormControl('address1'),
cp:new FormControl('cp1')
}),
FormGroup({
address:new FormControl('address2'),
cp:new FormControl('cp2')
})]
})再一次,两者都给予同样的“价值”。
{
name:'name',direction:[
{address:'address1',cp:'cp1'},
{address:'address2',cp:'cp2'}]
}您可以使用自定义表单控件来控制存储对象的formControl和使用ControlValueAccessor,但实际上我更喜欢另一种方法(*);它是一个简单的组件,并作为输入传递给formGroup或FormControl。如果您想维护最简单的东西,不要使用formControl来存储对象。如果我有一个组件应用程序方向,比如
@Input()formGroup
<input [formControl]="formGroup('address')">
<input [formControl]="formGroup('cp')">你可以用
<app-direction [formGroup]="myform.get('direcction')"></app-direction>或者如果您有一个表单数组
<div *ngFor="let group of myForm.get('direction').controls">
<app-direction [formGroup]="group"></app-direction>
</div>没有ViewChild,没有ControlValueAccesor,没有任何东西,表单是在main.component中创建的。
你的队友正在用ControlValueAccesor来控制一个对象?这只是一个观点,但他正在使应用程序复杂化,真的:“让事情变得简单”,看看别人如何解决类似的问题,重新发明轮子通常是个坏主意。
(*)我认为应使用自定义表单控件来制作具有“特殊外观”的“特殊控件”。
发布于 2020-02-11 08:03:01
https://stackoverflow.com/questions/60163266
复制相似问题