从表单控件中删除验证器 Angular 6
Remove validators from form control Angular 6
我有一个表单,其中包含许多表单控件和一些控件的验证器,例如:
title = new FormControl("", Validators.compose([
Validators.required
]));
description = new FormControl("", [
Validators.required,
Validators.minLength(1),
Validators.maxLength(2000)
]);
如何添加不验证控件的另存为草稿按钮?或者删除它们?
我试过很多例子,例如:
saveDraft() {
this.addProjectForm.controls.title.clearValidators();
this.addProjectForm.controls.title.setErrors(null);
this.addProjectForm.controls.title.setValidators(null);
}
或
saveDraft() {
this.addProjectForm.controls['title'].clearValidators();
this.addProjectForm.controls['title'].setErrors(null);
this.addProjectForm.controls['title'].setValidators(null);
}
但没有任何效果..
我已经使用此另存为草稿功能实现了很多表单。
我通常做的是,将提交按钮保持为禁用状态,除非表单是 valid
。但始终启用“另存为草稿”按钮。
这允许我做的是,在用户单击“另存为草稿”按钮的情况下保存表单内容而不应用任何验证。
用户无法单击“保存”按钮,因为表单无效。
所有这些都转化为这样的代码:
<div class="image-flip">
<div class="mainflip">
<div class="frontside">
<div class="card">
<div class="card-body add-generic-card">
<form [formGroup]="addGameForm">
...
<div class="draft-publish-button">
<button
class="..."
type="button"
(click)="onFormSubmit('DRAFT')">
Save as Draft
</button>
<button
class="..."
type="button"
(click)="onFormSubmit('PUBLISHED')"
[disabled]="addGameForm.invalid">
Publish
</button>
</div>
</form>
</div>
</div>
</div>
</div>
</div>
如果您想从您的字段中删除验证器,您可以尝试以下另一种解决方案:
public saveDraft(): void {
this.addProjectForm.get('title').clearValidators();
this.addProjectForm.get('title').updateValueAndValidity();
}
试试这个:
this.addProjectForm.get('title').setValidators([]); // or clearValidators()
this.addProjectForm.get('title').updateValueAndValidity();
如果要添加验证器,请附加验证器数组:
this.addProjectForm.get('title').setValidators([Validators.required]);
this.addProjectForm.get('title').updateValueAndValidity();
注意:您必须在每次更改后使用 updateValueAndValidity()
我发现最好的解决方案是不对输入字段(表单控件)进行任何验证,然后添加此代码以允许按下提交按钮:
ngAfterViewInit() {
this.addProjectForm.valueChanges.subscribe(data => {
//console.log(data)
if(data.title.length != 0 &&
data.description.length != 0 &&
data.ddemployees.length != 0 &&
data.competences.includes(true) &&
data.methods.includes(true) &&
data.enddate.length != 0 &&
data.contactname.length != 0 &&
data.contactemail.length != 0 &&
data.contactphonenumber.length != 0
) {
//console.log(data.title.length)
this.allowSubmit = true;
}
});
}
我已经尝试了以上所有方法,但对我来说以下代码有效。
let formControl : FormControl = this.formGroup.get("mouldVendor") as FormControl;
formControl.clearValidators();
formControl.setValidators(null);
formControl.updateValueAndValidity();
这可能对某人有所帮助。
由于另一个字段“.valuechanges”订阅,我最终添加了验证,当我去清除它们时,它什么也做不了。
解决方案是在表单控件上使用方法 .clearAsyncValidators(),而不是典型的 clearValidators()。
您仍然需要 updateValueAndValidity(),但这对我有用。
编码愉快!
您可以使用:AbstractControl.removeValidators(ValidatorFn)
不确定在 angular 6 中是否可行,但肯定在 Angular 12 及更高版本中可行。
但是,它需要对 exact same function 的引用。
只是给它 Validators.required 是行不通的。您需要为它创建一个唯一的引用:
requiredValidator = Validators.required;
this.form = this._fb.group({
title: ['', [this.requiredValidator, Validators.minLength(3), Validators.maxLength(50)]],
description: ['', [this.requiredValidator, Validators.minLength(3)]]
});
saveDraft() {
this.title.removeValidator(this.requiredValidator);
}
get title(): AbstractControl {
return this.form.get('title');
}
我有一个表单,其中包含许多表单控件和一些控件的验证器,例如:
title = new FormControl("", Validators.compose([
Validators.required
]));
description = new FormControl("", [
Validators.required,
Validators.minLength(1),
Validators.maxLength(2000)
]);
如何添加不验证控件的另存为草稿按钮?或者删除它们?
我试过很多例子,例如:
saveDraft() {
this.addProjectForm.controls.title.clearValidators();
this.addProjectForm.controls.title.setErrors(null);
this.addProjectForm.controls.title.setValidators(null);
}
或
saveDraft() {
this.addProjectForm.controls['title'].clearValidators();
this.addProjectForm.controls['title'].setErrors(null);
this.addProjectForm.controls['title'].setValidators(null);
}
但没有任何效果..
我已经使用此另存为草稿功能实现了很多表单。
我通常做的是,将提交按钮保持为禁用状态,除非表单是 valid
。但始终启用“另存为草稿”按钮。
这允许我做的是,在用户单击“另存为草稿”按钮的情况下保存表单内容而不应用任何验证。
用户无法单击“保存”按钮,因为表单无效。
所有这些都转化为这样的代码:
<div class="image-flip">
<div class="mainflip">
<div class="frontside">
<div class="card">
<div class="card-body add-generic-card">
<form [formGroup]="addGameForm">
...
<div class="draft-publish-button">
<button
class="..."
type="button"
(click)="onFormSubmit('DRAFT')">
Save as Draft
</button>
<button
class="..."
type="button"
(click)="onFormSubmit('PUBLISHED')"
[disabled]="addGameForm.invalid">
Publish
</button>
</div>
</form>
</div>
</div>
</div>
</div>
</div>
如果您想从您的字段中删除验证器,您可以尝试以下另一种解决方案:
public saveDraft(): void {
this.addProjectForm.get('title').clearValidators();
this.addProjectForm.get('title').updateValueAndValidity();
}
试试这个:
this.addProjectForm.get('title').setValidators([]); // or clearValidators()
this.addProjectForm.get('title').updateValueAndValidity();
如果要添加验证器,请附加验证器数组:
this.addProjectForm.get('title').setValidators([Validators.required]);
this.addProjectForm.get('title').updateValueAndValidity();
注意:您必须在每次更改后使用 updateValueAndValidity()
我发现最好的解决方案是不对输入字段(表单控件)进行任何验证,然后添加此代码以允许按下提交按钮:
ngAfterViewInit() {
this.addProjectForm.valueChanges.subscribe(data => {
//console.log(data)
if(data.title.length != 0 &&
data.description.length != 0 &&
data.ddemployees.length != 0 &&
data.competences.includes(true) &&
data.methods.includes(true) &&
data.enddate.length != 0 &&
data.contactname.length != 0 &&
data.contactemail.length != 0 &&
data.contactphonenumber.length != 0
) {
//console.log(data.title.length)
this.allowSubmit = true;
}
});
}
我已经尝试了以上所有方法,但对我来说以下代码有效。
let formControl : FormControl = this.formGroup.get("mouldVendor") as FormControl;
formControl.clearValidators();
formControl.setValidators(null);
formControl.updateValueAndValidity();
这可能对某人有所帮助。 由于另一个字段“.valuechanges”订阅,我最终添加了验证,当我去清除它们时,它什么也做不了。
解决方案是在表单控件上使用方法 .clearAsyncValidators(),而不是典型的 clearValidators()。
您仍然需要 updateValueAndValidity(),但这对我有用。
编码愉快!
您可以使用:AbstractControl.removeValidators(ValidatorFn)
不确定在 angular 6 中是否可行,但肯定在 Angular 12 及更高版本中可行。 但是,它需要对 exact same function 的引用。 只是给它 Validators.required 是行不通的。您需要为它创建一个唯一的引用:
requiredValidator = Validators.required;
this.form = this._fb.group({
title: ['', [this.requiredValidator, Validators.minLength(3), Validators.maxLength(50)]],
description: ['', [this.requiredValidator, Validators.minLength(3)]]
});
saveDraft() {
this.title.removeValidator(this.requiredValidator);
}
get title(): AbstractControl {
return this.form.get('title');
}