我有一些表单组件实际上只是将一个大公式的某些部分包装成小块。我可以想象两种方法来做到这一点:一个 ControlValueAccessor 或一个简单的 PropertyBinding 将 FormControl 传递给子组件。
超级简单示例 https://stackblitz.com/edit/angular-dt6pva
核心思想:
...
providers: [
{
provide: NG_VALUE_ACCESSOR,
multi: true,
useExisting: forwardRef(() => Input01Component)
}
]
})
export class Input01Component implements ControlValueAccessor {
...
对比
...
@Input()
control = new FormControl();
...
ControlValueAccessor 方式感觉更“正确”,但也更“有效”。
问题:使用更简单的 FormControl-Input-Binding 时是否有任何方面/优点/缺点?
编辑
想想这个应该设计成表单的json结构
{
"id": 1,
"name": "Leanne Graham",
"username": "Bret",
"email": "Sincere@april.biz",
"address": {
"street": "Kulas Light",
"suite": "Apt. 556",
"city": "Gwenborough",
"company": {
"name": "Romaguera-Crona",
"catchPhrase": "Multi-layered client-server neural-net",
"bs": "harness real-time e-markets"
}
我会定义 3 个组件:PersonForm、AdressForm、CompanyForm
我想到的优点/缺点,有人可能会添加一些我没有看到的观点:
FormControl-输入
- ++更简单的子组件
- --不同的使用属性(我不能重用formControl /formControlName)
控制值访问器
- ++与所有其他输入组件的用法相同(formControlName)
- ——“更多工作”落实
- ??拆分一个大的表格定义。一方面,构建小型组件通常是一个好点,我可以重用表单组件。另一方面,我“松散”了可以直接发送到休息后端的数据结构的整体视图:
peronForm = new FormGroup({
id: new FormControl(),
name: new FormControl(),
username: new FormControl(),
email: new FormControl(),
address: new FormControl(), //>> handled by AdressComponent
company: new FormControl() //>> handled by CompanyComponent
});
直到现在:不确定这是好是坏:)
感谢您的帮助