У меня естьполе электронной почты, и я добавил два валидатора (обязательно для электронной почты), я хочу проверить статус валидации на input event
, чтобы вызвать API, проверить дозу члена моей системы, когда он действителен, если invalid
не звонитьAPI и не отображать сообщение об ошибке на странице.
Я покажу сообщение об ошибке в событии размытия (ввод электронной почты focusOut), сначала я использовал formControl.validator(formControl)
для запуска валидаторов и проверки formControl.valid
, я получил действительныйстатус успешен, но на странице будет отображаться сообщение об ошибке, потому что я подписался на statsuChange
, чтобы отображать сообщение об ошибке, когда в настоящее время статус равен invalid.
, я сохраняю валидаторы в переменной и передаю initEmailChaingeEvent()
дляпроверить статус проверки без события statusChange.Это может работать, но я думаю, что это не очень хороший способ, вот пример моей реализации:
живой пример
export class AppComponent {
public sampleForm: FormGroup;
@ViewChild('emailElm')
emailElm: ElementRef;
ngOnInit() {
this.initForm();
}
initForm() {
const emailValidtors = [
Validators.required,
Validators.email
]
const emailFC = new FormControl(null, {
validators: emailValidtors,
updateOn: 'blur'
});
//
this.sampleForm = new FormGroup({
'email': emailFC
});
//
this.initEmailChaingeEvent({
emailFC: emailFC,
validtors: emailValidtors
});
//
this.sampleForm.valueChanges.subscribe((val) => {
console.log('_blue event:valueChanges', val)
});
//
this.initShowErrorMsgEvent({
fc: emailFC
});
}
private initEmailChaingeEvent(arg: {
emailFC: FormControl,
validtors: any[]
}) {
fromEvent(this.emailElm.nativeElement, 'input')
.pipe(debounceTime(500))
.subscribe((event: Event) => {
const currentEmail = (event.target as HTMLInputElement).value;
// check is valid
// **quention** : how can I get validtors from fromcontrol self
// if I use arg.emailFC.validator(arg.emailFC) to ehcek status , it will trigger oberservable in initShowErrorMsgEvent(),
// but I just want to got valid result , I don't want to show error msg on UI at this time
for (const validator of arg.validtors) {
const inValid = validator(arg.emailFC);
if (inValid) {
console.log('input event:invalid', currentEmail);
return;
}
}
// **do sometheng when all valid**
console.log('input event:call API , email:',currentEmail );
});
}
private initShowErrorMsgEvent(arg: {
fc: FormControl,
}) {
arg.fc.statusChanges
.subscribe((status) => {
// console.log('status' , status);
if (status === 'INVALID') {
// show error msg....
console.log('_show error msg by antoher component');
}
});
}
}
<form [formGroup]="sampleForm">
<input formControlName="email" #emailElm >
</form>