Передача динамического имени свойства объекта в качестве связанного аргумента? - PullRequest
0 голосов
/ 01 августа 2020

Допустим, у меня есть эти два элемента управления формой:

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].

На этом этапе я застрял, какие-либо предложения?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...