Я создал форму с Angular2, и я создал следующий метод, чтобы проверить, существует ли уже существующий адрес электронной почты. Вот мой код:Angular2: электронная почта уже существует как пользовательский валидатор?
checkEmail(): void {
// FIRST PART
this.found = false;
// If user is not Premium...
if (!this.currentUser.isPremium) {
// ...and if user typed something in the input field, then apply validitor for email address
if (this.myForm.controls.email.value.length > 0) {
this.myForm.controls.email.setValidators([validateEmail()]);
this.myForm.controls.email.updateValueAndValidity();
// If user leaves the input field blank or empty the typed input, then apply validator for required
} else {
this.myForm.controls.email.setValidators([Validators.required]);
this.myForm.controls.email.updateValueAndValidity();
}
// If user is Premium...
} else if (this.currentUser.isPremium) {
// ...and if user typed something in the input field, then apply validitor for email address
if (this.myForm.controls.email.value.length > 0) {
this.myForm.controls.email.setValidators([validateEmail()]);
this.myForm.controls.email.updateValueAndValidity();
// If user leaves the input field blank or empty the typed input, then remove any validator
} else {
this.myForm.controls.email.setValidators(null);
this.myForm.controls.email.updateValueAndValidity();
}
}
// SECOND PART
// If the input field is valid then check if the email already exist on server...
if (this.myForm.controls.email.value.length > 0 && this.myForm.controls.email.valid) {
this.loadingIcon = true;
this.anagraficaService.getEmail(this.myForm.controls.email.value)
.then(response => {
let count = response.recordCount;
if (count > 0) {
this.found = true;
} else {
this.found = false;
}
this.loadingIcon = false;
})
.catch(error => {
this.found = false;
this.loadingIcon = false;
});
}
}
Чтобы включить кнопку Submit в файле шаблона, я проверяю для myForm.valid
и found
набор для false
:
<button type="submit" class="ui primary button" (click)="onSubmit()" [disabled]="!myForm.valid || found">Submit</button>
Теперь я хотел бы, чтобы проверить адрес электронной почты если он уже существует, я имею в виду вторую часть моего кода во внешнем файле (пользовательский валидатор), а затем проверяю правильность адреса электронной почты только в первой части моего кода. Что-то вроде этого:
this.myForm.controls.email.setValidators([validateEmail(), checkEmailExists()]);
this.myForm.controls.email.updateValueAndValidity();
У вас есть идея достичь тех же самых подтверждений? Любая лучшая практика по этой проблеме?
спасибо.
С вашим решением следует ли мне вводить LoginService в пользовательский валидатор, чтобы узнать, является ли пользователь Premium? Обратите внимание на первую часть моего кода. – smartmouse
вы не должны вводить что-либо в валидатор, потому что 1. он находится в области (закрытии) вашего компонента, где LoginService уже должен быть введен, и вы можете просто использовать его в валидаторе как 'this. currentUser' 2. validator не является объектом инъекции, потому что он не является компонентом/службой – smnbbrv
И как я могу назвать пользовательский валидатор ПОСЛЕ отправки? Я имею в виду, когда я POST ввод формы для создания пользователя. API возвращает мне Ok или KO, новичок может быть 401 -> «Электронная почта уже существует». Итак, как я могу справиться с этой ошибкой и вызвать валидатор, чтобы установить его, есть ошибка {emailExists: true} и сообщение об ошибке в шаблоне? –