ReactiveForms Angular 验证
ReactiveForms Angular validation
我有一些这样的反应形式:
this.form = this.formBuilder.group({
filter: [''],
filterReason: [''],
documentsRequired: [''],
urgencyReason: [''],
reportRequestedDate: [''],
urgencyDate: [''],
urgencyRemarks: ['']
});
还有一些像这样的值:
validation = false;
我遇到的问题是我需要在 html 中切换 validation 的值,并基于此 if validation = true 我需要向某些字段添加验证,如下所示:
this.form = this.formBuilder.group({
filter: [''],
filterReason: [''],
documentsRequired: [''],
urgencyReason: [''],
reportRequestedDate: ['', Validation.required],
urgencyDate: ['', Validation.required],
urgencyRemarks: ['', Validation.required]
});
即使我在渲染组件时有初始化表单,该怎么做?
Angular 在 AbstractControl
上公开了我们的 setValidators 方法,因此您可以根据您的条件更改验证器集:
onValidationChanged(validation: boolean) {
['reportRequestedDate', 'urgencyDate', 'urgencyRemarks'].forEach(name => {
this.form.get(name).setValidators(validation ? Validators.required : null);
});
}
在你的 html:
<button (click)="toggleValidation();">toggle validation
</button>
在你的 ts 中:
toggleValidation(validation : boolean)
Object.keys(this.form).forEach(key=> {
this.form.get(key).setValidators(validation && key.*your condition* ? Validators.required : null); });}
Here is a complete StackBlitz with ReactiveForms and dynamic validation.
我们的想法是在 validation
属性 上设置一个 setter,这样您就可以在每次使用 myControl.setValidators(validate ? [Validators.required] : null)
设置 属性 时切换验证器然后通过调用 myControl.updateValueAndValidity()
更新其有效性状态
这里的 FormControl
有两种方法很重要:
- setValidators()
- updateValueAndValidity()
import { Component } from '@angular/core';
import { FormBuilder, FormControl, Validators } from '@angular/forms';
@Component({
selector: 'my-app',
templateUrl: './app.component.html',
styleUrls: [ './app.component.css' ]
})
export class AppComponent {
form: any;
private _validation = true;
constructor(private formBuilder: FormBuilder) {
this.form = this.formBuilder.group({
filter: ['Hello'],
filterReason: ['Test'],
documentsRequired: ['Document'],
urgencyReason: ['Nothing'],
reportRequestedDate: [''],
urgencyDate: ['Today'],
urgencyRemarks: ['']
});
this.setValidators(this.validation);
}
set validation(validate: boolean) {
this._validation = validate;
this.setValidators(validate);
}
get validation(): boolean {
return this._validation;
}
setValidators(validate: boolean): void {
this.reportRequestedDate.setValidators(validate ? [Validators.required] : null);
this.reportRequestedDate.updateValueAndValidity();
this.urgencyDate.setValidators(validate ? [Validators.required] : null);
this.reportRequestedDate.updateValueAndValidity();
this.urgencyRemarks.setValidators(validate ? [Validators.required] : null);
this.urgencyRemarks.updateValueAndValidity();
}
onSubmit(): void {
if (this.form.valid) {
console.log(this.form.value);
}
}
get reportRequestedDate(): FormControl {
return this.form.get('reportRequestedDate') as FormControl;
}
get urgencyDate(): FormControl {
return this.form.get('urgencyDate') as FormControl;
}
get urgencyRemarks(): FormControl {
return this.form.get('urgencyRemarks') as FormControl;
}
}
希望对您有所帮助!
我有一些这样的反应形式:
this.form = this.formBuilder.group({
filter: [''],
filterReason: [''],
documentsRequired: [''],
urgencyReason: [''],
reportRequestedDate: [''],
urgencyDate: [''],
urgencyRemarks: ['']
});
还有一些像这样的值:
validation = false;
我遇到的问题是我需要在 html 中切换 validation 的值,并基于此 if validation = true 我需要向某些字段添加验证,如下所示:
this.form = this.formBuilder.group({
filter: [''],
filterReason: [''],
documentsRequired: [''],
urgencyReason: [''],
reportRequestedDate: ['', Validation.required],
urgencyDate: ['', Validation.required],
urgencyRemarks: ['', Validation.required]
});
即使我在渲染组件时有初始化表单,该怎么做?
Angular 在 AbstractControl
上公开了我们的 setValidators 方法,因此您可以根据您的条件更改验证器集:
onValidationChanged(validation: boolean) {
['reportRequestedDate', 'urgencyDate', 'urgencyRemarks'].forEach(name => {
this.form.get(name).setValidators(validation ? Validators.required : null);
});
}
在你的 html:
<button (click)="toggleValidation();">toggle validation
</button>
在你的 ts 中:
toggleValidation(validation : boolean)
Object.keys(this.form).forEach(key=> {
this.form.get(key).setValidators(validation && key.*your condition* ? Validators.required : null); });}
Here is a complete StackBlitz with ReactiveForms and dynamic validation.
我们的想法是在 validation
属性 上设置一个 setter,这样您就可以在每次使用 myControl.setValidators(validate ? [Validators.required] : null)
设置 属性 时切换验证器然后通过调用 myControl.updateValueAndValidity()
这里的 FormControl
有两种方法很重要:
- setValidators()
- updateValueAndValidity()
import { Component } from '@angular/core';
import { FormBuilder, FormControl, Validators } from '@angular/forms';
@Component({
selector: 'my-app',
templateUrl: './app.component.html',
styleUrls: [ './app.component.css' ]
})
export class AppComponent {
form: any;
private _validation = true;
constructor(private formBuilder: FormBuilder) {
this.form = this.formBuilder.group({
filter: ['Hello'],
filterReason: ['Test'],
documentsRequired: ['Document'],
urgencyReason: ['Nothing'],
reportRequestedDate: [''],
urgencyDate: ['Today'],
urgencyRemarks: ['']
});
this.setValidators(this.validation);
}
set validation(validate: boolean) {
this._validation = validate;
this.setValidators(validate);
}
get validation(): boolean {
return this._validation;
}
setValidators(validate: boolean): void {
this.reportRequestedDate.setValidators(validate ? [Validators.required] : null);
this.reportRequestedDate.updateValueAndValidity();
this.urgencyDate.setValidators(validate ? [Validators.required] : null);
this.reportRequestedDate.updateValueAndValidity();
this.urgencyRemarks.setValidators(validate ? [Validators.required] : null);
this.urgencyRemarks.updateValueAndValidity();
}
onSubmit(): void {
if (this.form.valid) {
console.log(this.form.value);
}
}
get reportRequestedDate(): FormControl {
return this.form.get('reportRequestedDate') as FormControl;
}
get urgencyDate(): FormControl {
return this.form.get('urgencyDate') as FormControl;
}
get urgencyRemarks(): FormControl {
return this.form.get('urgencyRemarks') as FormControl;
}
}
希望对您有所帮助!