Angular 自定义异步验证器不工作
Angular custom async validator not working
这里是demo plnkr。我正在尝试为具有文本框和验证按钮的 OTP 输入实现自定义异步验证器。我只想在用户单击验证 OTP 按钮或表单提交按钮时验证输入。目前正在对文本更改事件进行验证,但它不起作用。
表格HTML:
<form [formGroup]="registrationForm" (ngSubmit)="registrationForm.valid && submitRegistration(registrationForm.value)" novalidate>
<fieldset class="form-group">
<label for="e-mail">Mobile</label>
<div class="input-group">
<input type="text" class="form-control" placeholder="Mobile" formControlName="mobile">
<span class="input-group-btn">
<button class="btn btn-secondary" type="button">Send OTP</button>
</span>
</div>
<div class="form-text error" *ngIf="registrationForm.controls.mobile.touched">
<div *ngIf="registrationForm.controls.mobile.hasError('required')">Mobile is required.</div>
</div>
</fieldset>
<fieldset class="form-group">
<label for="e-mail">Verify OTP</label>
<div class="input-group">
<input type="text" class="form-control" placeholder="OTP" formControlName="otp">
<span class="input-group-btn">
<button class="btn btn-secondary" (click)="veryOTPAsyn(otp)" type="button">Verify</button>
</span>
</div>
<div class="form-text error" *ngIf="registrationForm.controls.otp.touched">
<div *ngIf="registrationForm.controls.otp.hasError('required')">OTP is required.</div>
<div *ngIf="registrationForm.controls.otp.hasError('invalidOtp')">OTP is invalid.</div>
</div>
</fieldset>
<button class='btn btn-primary' type='submit' [disabled]='!registrationForm.valid'>Submit Registration Form</button>
</form>
表单组件:
export class ExampleFormComponent {
registrationForm: FormGroup;
constructor(public fb: FormBuilder) {
// Example use of FormBuilder, FormGroups, and FormControls
this.registrationForm = fb.group({
mobile: ['', Validators.required],
otp: ['', Validators.compose([Validators.required, this.veryOTPAsyn.bind(this)])],
dob: ['', Validators.required],
email: ['', Validators.compose([Validators.required, emailValidator])],
password: ['', Validators.required],
confirmPassword: ['', Validators.required],
firstName: ['', Validators.required],
lastName: ['', Validators.required]
}, {validator: matchingPasswords('password', 'confirmPassword')})
}
submitRegistration(value: Object): void {
console.log(value);
}
veryOTPAsyn(otpControl: FormControl): Promise<any> {
console.log(otpControl)
console.log(otpControl.hasError('invalidOtp'))
return new Promise<any>(
(resolve, reject) => {
setTimeout(() => {
resolve({invalidOtp:true});
}, 500);
});
}
}
试试这个:
otp: ['', Validators.required, this.veryOTPAsyn.bind(this)]
异步验证器进入第三个参数
我会考虑删除自定义验证,而是在用户单击按钮时设置/删除错误,因为自定义验证器将 运行 在组件初始化时以及输入值更改时。所以有你的点击事件,并做这样的事情(伪代码):
(click)="veryOTPAsyn(registrationForm.controls.otp)"
和 TS:
veryOTPAsyn(ctrl: FormControl) {
if(ctrl.value == 'hey') {
ctrl.setErrors({'invalidOtp':true})
} else {
ctrl.setErrors({'invalidOtp':null})
}
}
分叉 PLUNKER.
编辑:
但是如果你想走使用异步验证器的路线,只需将验证器添加为第三个参数,然后你就不需要 'validate' 按钮了。
otp: ['', [Validators.required], [this.veryOTPAsyn]]
或者像 v 发布后现在做的那样做 5.0.0
otp: ['', {validators: [Validators.required], asyncValidators: [this.veryOTPAsyn]}]
PLUNKER(pre v.5.0.0,所以使用标记异步验证器的第一个选项)
这里是demo plnkr。我正在尝试为具有文本框和验证按钮的 OTP 输入实现自定义异步验证器。我只想在用户单击验证 OTP 按钮或表单提交按钮时验证输入。目前正在对文本更改事件进行验证,但它不起作用。 表格HTML:
<form [formGroup]="registrationForm" (ngSubmit)="registrationForm.valid && submitRegistration(registrationForm.value)" novalidate>
<fieldset class="form-group">
<label for="e-mail">Mobile</label>
<div class="input-group">
<input type="text" class="form-control" placeholder="Mobile" formControlName="mobile">
<span class="input-group-btn">
<button class="btn btn-secondary" type="button">Send OTP</button>
</span>
</div>
<div class="form-text error" *ngIf="registrationForm.controls.mobile.touched">
<div *ngIf="registrationForm.controls.mobile.hasError('required')">Mobile is required.</div>
</div>
</fieldset>
<fieldset class="form-group">
<label for="e-mail">Verify OTP</label>
<div class="input-group">
<input type="text" class="form-control" placeholder="OTP" formControlName="otp">
<span class="input-group-btn">
<button class="btn btn-secondary" (click)="veryOTPAsyn(otp)" type="button">Verify</button>
</span>
</div>
<div class="form-text error" *ngIf="registrationForm.controls.otp.touched">
<div *ngIf="registrationForm.controls.otp.hasError('required')">OTP is required.</div>
<div *ngIf="registrationForm.controls.otp.hasError('invalidOtp')">OTP is invalid.</div>
</div>
</fieldset>
<button class='btn btn-primary' type='submit' [disabled]='!registrationForm.valid'>Submit Registration Form</button>
</form>
表单组件:
export class ExampleFormComponent {
registrationForm: FormGroup;
constructor(public fb: FormBuilder) {
// Example use of FormBuilder, FormGroups, and FormControls
this.registrationForm = fb.group({
mobile: ['', Validators.required],
otp: ['', Validators.compose([Validators.required, this.veryOTPAsyn.bind(this)])],
dob: ['', Validators.required],
email: ['', Validators.compose([Validators.required, emailValidator])],
password: ['', Validators.required],
confirmPassword: ['', Validators.required],
firstName: ['', Validators.required],
lastName: ['', Validators.required]
}, {validator: matchingPasswords('password', 'confirmPassword')})
}
submitRegistration(value: Object): void {
console.log(value);
}
veryOTPAsyn(otpControl: FormControl): Promise<any> {
console.log(otpControl)
console.log(otpControl.hasError('invalidOtp'))
return new Promise<any>(
(resolve, reject) => {
setTimeout(() => {
resolve({invalidOtp:true});
}, 500);
});
}
}
试试这个:
otp: ['', Validators.required, this.veryOTPAsyn.bind(this)]
异步验证器进入第三个参数
我会考虑删除自定义验证,而是在用户单击按钮时设置/删除错误,因为自定义验证器将 运行 在组件初始化时以及输入值更改时。所以有你的点击事件,并做这样的事情(伪代码):
(click)="veryOTPAsyn(registrationForm.controls.otp)"
和 TS:
veryOTPAsyn(ctrl: FormControl) {
if(ctrl.value == 'hey') {
ctrl.setErrors({'invalidOtp':true})
} else {
ctrl.setErrors({'invalidOtp':null})
}
}
分叉 PLUNKER.
编辑:
但是如果你想走使用异步验证器的路线,只需将验证器添加为第三个参数,然后你就不需要 'validate' 按钮了。
otp: ['', [Validators.required], [this.veryOTPAsyn]]
或者像 v 发布后现在做的那样做 5.0.0
otp: ['', {validators: [Validators.required], asyncValidators: [this.veryOTPAsyn]}]
PLUNKER(pre v.5.0.0,所以使用标记异步验证器的第一个选项)