Я знаю, что это мог быть возможный дубликат, но дубликат не помог мне, потому что мой валидатор не установлен на уровне FormGroup
. Валидатор работает. Переменная res
дает мне true
, когда имя пользователя уже занято, и false
, если нет.
Класс валидатора:
@Injectable({ providedIn: 'root' })
export class AlreadyTakenValidator {
static checkUsername(registrationService: RegistrationService) {
return (control: AbstractControl) => {
if (control.value == "") {
return null;
}
console.log(control.value)
return registrationService.checkUsername(control.value).subscribe(res => {
console.log("ab " + res)
if(res) {
const usernameIsTaken = true;
console.log("usernameIsTaken " + usernameIsTaken)
return (usernameIsTaken);
} else {
console.log("bischt null kerle?" + res)
const usernameIsTaken = null;
console.log("usernameIsTaken " + usernameIsTaken)
return usernameIsTaken;
}
return res ? { usernameIsTaken: true } : null;
});
}
}
Я просто так сделал, чтобы всё проверить. Обычно последней строки return res ? { usernameIsTaken: true } : null;
должно быть достаточно.
Мой TS:
public buildForm() {
this.registerForm = this.form.group({
username: ['', [Validators.required, Validators.minLength(this.minLength), CustomValidators.validateCharacters, AlreadyTakenValidator.checkUsername(this.registrationService)]],
email: ['', [Validators.required, Validators.email, CustomValidators.validateCharacters]],
password: ['', [Validators.required]],
passwordConfirmation: ['', Validators.required],
}, {
validator: MustMatch('password', 'passwordConfirmation')
});
this.personalForm = this.form.group({
firstname: ['', [Validators.required, NoWhitespaceValidator()]],
lastname: ['', [Validators.required, NoWhitespaceValidator()]],
country: ['', [Validators.required]],
dateOfBirth: ['', [Validators.required]],
gender: ['', [Validators.required]],
})
}
AlreadyTakenValidator.checkUsername(this.registrationService)
это проблема.
В html я просто звоню:
<mat-error class="invalid-feedback"
*ngIf="f.username.touched && f.username.errors && f.username.errors.usernameIsTaken">
Already taken
</mat-error>
<mat-error class="invalid-feedback"
*ngIf="f.username.touched && f.username.errors && f.username.errors.required">
{{ 'REGISTRATION.USERNAME' | translate }} {{ 'VALIDATION.REQUIRED' | translate }}
</mat-error>
<mat-error class="invalid-feedback"
*ngIf="f.username.touched && f.username.errors && f.username.errors.minlength">
{{ 'VALIDATION.MINLENGTH' | translate }} {{ minLength }}
</mat-error>
<mat-error class="invalid-feedback"
*ngIf="f.username.touched && f.username.errors && f.username.errors.invalid_characters">
{{ 'VALIDATION.CHARACTERS' | translate }}
Также мой CustomValidators.validateCharacters
валидатор настроен так, как говорит само название, и работает нормально, но этот не так.