Допустим, у меня есть эти два элемента управления формой:
userName: new FormControl(
null,
Validators.required,
this.takenUsername.bind(this) // add "userName" here
),
email: new FormControl(
null,
[Validators.required, Validators.email],
this.takenEmail.bind(this) // add "email" here
)
Где у меня есть this.takenUsername.bind (this) и this.takenEmail.bind (this):
takenUsername(control: FormControl): Promise<any> | Observable < any > {
const promise = new Promise<any>((resolve, reject) => {
let text$ = fromEvent(this.userName.nativeElement, "keyup") //this.userName variable with @ViewChild
.pipe(
debounceTime(200),
distinctUntilChanged(),
switchMap(() => this.employeeService.getEmployeeList())
)
.subscribe((employees) => {
const properties = employees.map((employee) => employee.userName);
for (let tempProperty of properties) {
if (tempProperty === control.value) {
resolve({ usernameIsTaken: true });
} else {
resolve(null);
}
}
});
});
return promise;
}
takenEmail(control: FormControl): Promise<any> | Observable < any > {
const promise = new Promise<any>((resolve, reject) => {
let text$ = fromEvent(this.email.nativeElement, "keyup") // this.email is a variable with @ViewChild
.pipe(
debounceTime(200),
distinctUntilChanged(),
switchMap(() => this.employeeService.getEmployeeList())
)
.subscribe((employees) => {
const properties = employees.map((employee) => employee.email);
for (let tempProperty of properties) {
if (tempProperty === control.value) {
resolve({ emailIsTaken: true });
} else {
resolve(null);
}
}
});
});
return promise;
}
Нет способа сделать эти два настраиваемых валидатора одним методом? Я пробовал это:
takenProperty(control: FormControl, property: string): Promise<any> | Observable < any > {
const promise = new Promise<any>((resolve, reject) => {
let text$ = fromEvent(this[property].nativeElement, "keyup")
.pipe(
debounceTime(200),
distinctUntilChanged(),
switchMap(() => this.employeeService.getEmployeeList())
)
.subscribe((employees) => {
const properties = employees.map((employee) => employee[property]); // error here
for (let tempProperty of properties) {
if (tempProperty === control.value) {
resolve({ [`${property}IsTaken`]: true });
} else {
resolve(null);
}
}
});
});
return promise;
}
Итак, я сделал this.takenProperty(this, "userName")
или «электронную почту», но это не сработало, потому что значение свойства будет содержать всю formControl.
Итак, я обнаружил, что для чистого удачно, что параметр control: FormControl в методе содержит аргумент «userName» или «email».
Тем не менее, сотрудник [control] выдает ошибку, которую предлагается исправить путем преобразования (< string >< unknown >control)
.
Ошибка исчезает, но если я console.log, свойства const, которые он регистрирует [undefined].
На этом этапе я застрял, какие-либо предложения?