Angular 使用验证程序禁用FormGroup
我在我的Angular 使用验证程序禁用FormGroup,angular,typescript,checkbox,formarray,formgroups,Angular,Typescript,Checkbox,Formarray,Formgroups,我在我的checkboxForm上有formArray复选框,如果没有选中复选框,我需要禁用按钮submit,我在我的checkboxForm上实现了自定义验证器,这就是我尝试过的 Ts文件 get formReceivedSummons() { return this.checkboxForm.get('receivedSummons') as FormArray; } ngOnInit() { this.checkboxForm = this.formBuild
checkboxForm
上有formArray
复选框,如果没有选中复选框,我需要禁用按钮submit
,我在我的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;
}
<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>
我在formArray
中放置了验证器,这就是this.formReceivedSummons.setValidators([MinSelectedCheckBox(1)]代码>
这是我在html文件中实现的
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;
}
<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>
通过使用Validators.requiredTrue
,它需要选中两个复选框,然后它将启用按钮,但我的要求是,我需要至少选中一个复选框,这样才能启用按钮提交表单如下所示:
导出一个函数。大概是这样的:
export function customValdiator(form: FormGroup) {
const formValue = form.value;
// with the formValue apply your own validation logic .
if (/* HAVE ERROR */) {
return { checkboxesRequired: true };
} else {
return null;
}
}
构建您的表单:
this.checkboxForm = this.formBuilder.group({
receivedSummons: this.formBuilder.array([])
}, { validator: customValdiator });
并从AddCheckBox方法中删除AddValidator
无论您是否在receivedSummons
FormArray中添加或删除行,当您更改表单上的任何数据时,angular将执行customValdiator
函数并将表单作为参数传递,并且您可以访问当前已选中的有效receivedSummons值。当您在构造函数中初始化表单时首先将验证器添加到formarray。然后在收到数据后调用addcheckbox
方法
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();
});
}
在add复选框中
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);
});
}
验证器在工作吗?此表单组发出了无效标志?不是,验证程序不工作,应该是,按钮提交被禁用,直到我选中其中一个复选框,但它没有。如果您希望对数组进行自定义验证,则是我的方法错误@埃利塞