【发布时间】:2019-12-22 07:33:42
【问题描述】:
我正在尝试寻找一种更好的方法来处理复杂的角度形式。 表格真的很大,我需要找到一种方法来降低复杂性。
这里是表单结构的一个例子:
{
"fieldA" : ...,
"fieldB" : ...,
"fieldC" : ...,
"profile": {
"username": ...,
"email": ...,
"firstName": ...,
"lastName": ...,
...
},
"settings": {
"enableEmailNotification": ...,
"notificationsEmail": ..., // required when enableEmailNotification
...
},
...
}
在某些情况下验证器会即时更改,例如当enableEmailNotification=true 时,组件会将Required 验证器添加到notificationsEmail
这里是研究过的选项:
选项 #0 - 经典
这种方法使用一种形式和一种组件。
优点:
- 代码很多,但很简单
缺点:
- 所有逻辑都在一个地方。对于我来说,这个组件变得太大并且难以阅读或维护
- UI 也变得足够大了
选项 #1 - 将 FormGroup 传递给子组件
这种方法将formGroup 作为@Input() 属性发送到内部组件。
优点:
- 缩小部分视图
缺点:
- 表单创建和验证规则仍在父组件中
- 仅缩小视图大小
- 在根组件中创建了验证逻辑,但在子组件中显示错误
选项 #2 - 创建自定义 ControlValueAccessor
基于this article,我们可以创建自定义的ControlValueAccessor,它将返回一个表单的一部分的对象。
优点:
- 以多种形式拆分表单。表单可以拆分为更小的独立部分。
缺点:
- 为表单值保留 JS 对象。看起来不太好
【问题讨论】:
标签: javascript angular typescript angular-material