У меня есть валидатор, который проверяет, является ли адрес электронной почты пользователей уникальным, для этого мне нужно также передать идентификатор пользователей, чтобы он не включал себя в уникальные проверки. Каков наилучший способ достичь этого?Передача дополнительного значения в пользовательский валидатор в Angular2?
Из того, что я могу сказать, валидатор имеет доступ только к контрольным значениям. Я зацепив мой валидатор, как это:
<input #emailAddress="ngForm" type="text" [(ngModel)]="user.emailAddress" ngControl="emailAddress" required userExists />
В настоящее время единственным способом я смог достичь это путем установки статического значения на валидатор, который не является идеальным! Вот мой полный код для валидатора:
import { NG_ASYNC_VALIDATORS, Control } from '@angular/common';
import { Directive, provide, forwardRef, Attribute } from '@angular/core';
import { UserService } from './user.service';
import { User } from './user.model';
interface ValidationResult {
[key: string]: boolean;
}
@Directive({
selector: '[userExists][ngModel]',
providers: [
provide(NG_ASYNC_VALIDATORS, {
useExisting: forwardRef(() => UserExistsValidator),
multi: true
})
]
})
export class UserExistsValidator {
public static user: User;
constructor(private _userService: UserService) { }
validate(control: Control): Promise<ValidationResult> {
return new Promise((resolve, reject) => {
this._userService.exists(control.value, UserExistsValidator.user.id).subscribe(
(response: any) => {
if (response.exists)
return resolve({ userExists: { valid: false } });
else
return resolve(null);
},
(error: any) => { console.log(error); }
)
});
}
}
Есть ли преимущество для этого, чем путем добавления статической переменной в валидаторе для передачи дополнительного значения? – matthewrk
Статическая переменная может изменить его для любого экземпляра вашего приложения. С помощью службы вы можете как минимум ограничить ее текущим компонентом (по крайней мере, это то, что я ожидаю от того, как он будет себя вести) –
не работает для меня - не может найти имя «предоставить» – Tucker