angular - 使用验证器禁用 FormGroup
问题描述
我有formArray
复选框checkboxForm
,如果没有复选框,我需要禁用按钮提交checked
,我已经在我的 上实现了自定义验证器checkboxForm
,这是我尝试过的;
ts文件
get formReceivedSummons() {
return this.checkboxForm.get('receivedSummons') as FormArray;
}
ngOnInit() {
this.checkboxForm = this.formBuilder.group({
receivedSummons: this.formBuilder.array([])
});
this.getReceivedSummons();
}
getReceivedSummons() {
this.receivedSummonsSubscription = this.inquiryStore.summons$
.subscribe(receivedSummons => {
this.receivedSummons = receivedSummons;
});
}
addCheckboxes() {
this.formReceivedSummons.setValue([]);
this.formReceivedSummons.setValidators([minSelectedCheckboxes(1)]);
this.receivedSummons.data.items.map(x => {
this.formReceivedSummons.push(
this.formBuilder.group({
itemNo: [x.itemNo],
isChecked: false,
}));
});
}
function minSelectedCheckboxes(min = 1) {
const validator: ValidatorFn = (formArray: FormArray) => {
const totalSelected = formArray.controls
.map(control => control.value)
.reduce((prev, next) => (next ? prev + next : prev), 0);
return totalSelected >= min ? null : { required: true };
};
return validator;
}
我有地方验证formArray
器 this.formReceivedSummons.setValidators([minSelectedCheckboxes(1)]);
这是我在html 文件中实现的
<form [formGroup]="checkboxForm" (ngSubmit)="submitSelectedCheckbox()">
<ng-container formArrayName="receivedSummons" *ngFor="let summon of formReceivedSummons.controls; let i = index">
<ng-container [formGroupName]="i">
<input type="checkbox" formControlName="isChecked"> {{summon.value.itemNo}}
</ng-container>
</ng-container>
<button [disabled]="!checkboxForm .valid">submit</button>
</form>
我的 checkboxForm 按钮已被禁用,但如果我选中一个checkbox
,它应该被启用,但它没有。我不确定如何解决问题,可以使用一些指南和指导来解决这个问题。
更新
基于我在谷歌的发现,所以,这是我能得到的接近,
addCheckboxes() {
this.formReceivedSummons.setValue([]);
this.receivedSummons.data.items.map(item => {
this.formReceivedSummons.push(
this.formBuilder.group({
itemNo: [x.itemNo]
isChecked: [false, Validators.requiredTrue],
}));
});
}
通过使用Validators.requiredTrue
,它需要两个复选框被选中,然后它将启用按钮,但我的要求我需要至少一个复选框被选中而不是启用按钮提交表单
解决方案
当您在构造函数中初始化表单时,首先将验证器添加到表单数组中。然后在收到数据后调用该addCheckboxes
方法。
form: FormGroup;
receivedSummons = [];
constructor(private formBuilder: FormBuilder) {
this.checkboxForm = this.formBuilder.group({
receivedSummons: new FormArray([], minSelectedCheckboxes(1))
});
of(this.someMethodWhichReturnReceivedSummons()).subscribe(receivedSummons => {
this.receivedSummons = receivedSummons;
this.addCheckboxes();
});
}
在 addCheckboxes
private addCheckboxes() {
this.receivedSummons.map((o, i) => {
const control = new FormControl(i === 0); // if first item set to true, else false
(this.form.controls.receivedSummons as FormArray).push(control);
});
}
推荐阅读
- ios - 如何检测音量上下是否被按下
- python - Boto3 访问 S3 存储桶时访问令牌无效
- ios - 代码点火器 - 无法连接:0 发送 ios 通知时
- mysql - 无法在 phpmyadmin - mysql 中添加外键约束
- regex - Regexp_like 与在线正则表达式验证器 - 不同的结果
- swift - 在 indexPath.row 的数组中快速打印元素
- c# - 如何在 Unity 中使用 C# 生成随机浮点数(Unity 拒绝大多数其他建议的答案)?
- react-native - 更新坐标数组时不呈现多条折线
- django - Django 忽略模型字段
- python - Python 数组和矩阵