angular - Angular 5 中的嵌套表单
问题描述
我正在尝试创建可能具有嵌套表单的组件。我嵌套它们是因为我想在多个阶段进行验证,即使我只会保存一次。也许我的问题还有另一种解决方案,但现在我的代码看起来有点像这样:
<form (submit)="save()" #form1="ngForm">
<form (submit)="accept()" #form2="ngForm">
<!-- #form2 fields -->
<button id="submit2" type="submit" />
</form>
<!-- #form1 fields -->
<button id="submit1" type="submit" />
</form>
当我单击#submit2
按钮时,它会提交我的#form1
表单,这是我没想到的。这怎么可能解决?
更新:
我发现我可以在按钮的属性中指定表单:
<button id="submit1" type="submit" form="form1" />
这完全符合我的预期。
解决方案
以您的方式嵌套表单并不是一个理想的方案。有更好的方法来实现这一点。其中之一是使用反应形式。让我们从一个例子开始。
我的自定义地址.component.ts
@Component({
selector: 'my-custom-address'
template: `
<label>Street</label>
<input type="text" [formControl]="group.controls.street" />
<label>City</label>
<input type="text" [formControl]="form.controls.city" />
`
})
export class MyCustomAddressComponent {
@Input() group: FormGroup;
}
我们有一个自定义组件来保存表单的嵌套部分。该组件接收我们使用 Angular 提供的 FormBuilder 构建的表单的一部分。
app.component.ts
@Component({
selector: 'app-component'
template: `
<form (submit)="save()">
<label>First name</label>
<input type="text" [formControl]="form.controls.firstName" />
<label>Last name</label>
<input type="text" [formControl]="form.controls.lastName" />
<my-custom-address [group]="form.controls.address"></my-custom-address>
</form>
`
})
export class AppComponent {
form: FormGroup = this.fb.group({
firstName: [null],
lastName: [null],
address: this.fb.group(
{
street: [null, [Validators.required]],
city: [null]
},
{
validators: [CUSTOM_GROUP_VALIDATOR]
}
)
});
constructor(private fb: FormBuilder) {}
}
应用程序组件包含我们完整的表单配置。如果您仔细观察,您会发现我们表单的地址控件有一个嵌套结构,其中包含街道和城市。这种方法的有趣之处在于,您可以将自定义验证器分配给一组这些控件(请参阅 CUSTOM_GROUP_VALIDATOR)。通过这种方式,您可以决定验证应该如何工作并在它发生时进行控制。
如果您要检查整个表单是否有效,您可以使用this.form.valid
它返回一个布尔值。
由于这个示例可能会让人不知所措,因此请务必查看 Angular 关于反应式表单和自定义表单验证器的文档。使用文档和我的示例,您应该被引导到正确的方向;)。
反应形式:https ://angular.io/guide/reactive-forms
自定义表单验证器:https ://angular.io/guide/form-validation#cross-field-validation
推荐阅读
- excel - 在 Excel 中创建一个在回答问题时向下移动的文本箭头
- oracle - Tibco Spotfire 桌面。信任自定义查询会破坏过滤器
- python - 在 Axes3D 中更改轴的位置
- python - 将抓取的数据附加到 CSV 文件
- asp.net-core - 当我的 API 需要授权令牌时,如何使用 Asp.Net Core 2.0 的内存中 TestServer 类进行集成测试?
- rest - Yii2 Api - 使用 Oauth 对用户和网站进行身份验证?
- android - 如何添加自增ID?
- postgresql - pgcrypto 在日志中保持可见的私钥?
- django - 尝试优化管理站点时出现“模型块已注册”错误
- android - 当相机到达标记上方时,如何在谷歌地图 v.3 中打开标记的标题?