Angular 2/5 涉及复选框的条件验证
Angular 2/5 conditional validation involving checkbox
我有一个反应式表单,其中有一个 table,每行都有一个复选框和一些用户输入。我想这样做,如果用户选中一个复选框,则需要填写相应的输入。例如如果 11+ 被选中但相应的用户输入即未填写价格并且用户尝试按下添加按钮,那么它不应该提交表单并且它应该提供一条消息。我不确定如何有条件地应用此逻辑。
TS 中的表格:
this.addSubjectForm = new FormGroup({
'type' : new FormControl(null, Validators.required),
'subject' : new FormControl(null, Validators.required),
'discount' : new FormControl(null),
'levelDefinition' : new FormGroup({
'11+' : new FormControl(null),
'KS3' : new FormControl(null),
'GCSE' : new FormControl(null),
'A-Level' : new FormControl(null),
'Degree' : new FormControl(null)
})
HTML table/form:
<form [formGroup]="addSubjectForm" (ngSubmit)="onAddSubject()">
<!-- the first three inputs (type, subject and discount) are not included here to reduce the amount of code shown in the question -->
<div formGroupName="levelDefinition">
<table class="table table-bordered table-condensed table-hover">
<thead>
<tr>
<th class="text-center">
<input type="checkbox" name="all"
(change)="isSelected = !isSelected" />
</th>
<th>Level</th>
<th>Price</th>
<th>Discounts</th>
</tr>
</thead>
<tbody>
<tr *ngFor="let level of levels ; let i = index">
<td class="text-center" >
<input type="checkbox"
value="{{level.id}}"
appHighlightOnCheck
formControlName="{{level}}"
[checked]="isSelected" />
</td>
<td class="text-center">{{ level }}</td>
<td>
<input
type="text"
class="form-control">
</td>
<td>
<input
type="text"
class="form-control">
</td>
</tr>
</tbody>
</table>
</div>
</form>
<button class="btn btn-primary" type="submit">Add</button>
方法是使用 cross-field 自定义验证器。
您需要将 2 个表单控件嵌套在一个表单组中(在 ts 和 html 中)。然后您需要构建一个自定义验证器并将其附加到此 formGroup。
我有一个反应式表单,其中有一个 table,每行都有一个复选框和一些用户输入。我想这样做,如果用户选中一个复选框,则需要填写相应的输入。例如如果 11+ 被选中但相应的用户输入即未填写价格并且用户尝试按下添加按钮,那么它不应该提交表单并且它应该提供一条消息。我不确定如何有条件地应用此逻辑。
TS 中的表格:
this.addSubjectForm = new FormGroup({
'type' : new FormControl(null, Validators.required),
'subject' : new FormControl(null, Validators.required),
'discount' : new FormControl(null),
'levelDefinition' : new FormGroup({
'11+' : new FormControl(null),
'KS3' : new FormControl(null),
'GCSE' : new FormControl(null),
'A-Level' : new FormControl(null),
'Degree' : new FormControl(null)
})
HTML table/form:
<form [formGroup]="addSubjectForm" (ngSubmit)="onAddSubject()">
<!-- the first three inputs (type, subject and discount) are not included here to reduce the amount of code shown in the question -->
<div formGroupName="levelDefinition">
<table class="table table-bordered table-condensed table-hover">
<thead>
<tr>
<th class="text-center">
<input type="checkbox" name="all"
(change)="isSelected = !isSelected" />
</th>
<th>Level</th>
<th>Price</th>
<th>Discounts</th>
</tr>
</thead>
<tbody>
<tr *ngFor="let level of levels ; let i = index">
<td class="text-center" >
<input type="checkbox"
value="{{level.id}}"
appHighlightOnCheck
formControlName="{{level}}"
[checked]="isSelected" />
</td>
<td class="text-center">{{ level }}</td>
<td>
<input
type="text"
class="form-control">
</td>
<td>
<input
type="text"
class="form-control">
</td>
</tr>
</tbody>
</table>
</div>
</form>
<button class="btn btn-primary" type="submit">Add</button>
方法是使用 cross-field 自定义验证器。 您需要将 2 个表单控件嵌套在一个表单组中(在 ts 和 html 中)。然后您需要构建一个自定义验证器并将其附加到此 formGroup。