【发布时间】:2020-07-07 07:15:56
【问题描述】:
我有一些表单组件,它们实际上只是将大公式的某些部分包装成小块。我可以想象有两种方法可以做到这一点:一个 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结构应该设计成form
{
"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
});
直到现在:不确定这是好是坏:)
感谢您的帮助
【问题讨论】:
-
不知道优点/缺点,但我知道当你连接表单组和控件时,Angular 会劫持所有表单验证(如果你想要的话)以及获取和设置的方法价值。当您需要验证时,FormGroups 和控件效果最佳,因为它减少了验证只是正则表达式的所有工作。
标签: angular angular-reactive-forms property-binding controlvalueaccessor