我有兩個非常相似的異步驗證器。兩者都檢查唯一性的值:電子郵件和首字母縮寫。第一種是這樣的:如何將服務注入異步驗證程序?
public static createEmailUniqueValidator(userService: UserService, originalEmailAddressFn:() => string) {
return (control: AbstractControl): Observable<ValidationErrors> => {
const originalEmailAddress: string = originalEmailAddressFn();
if (originalEmailAddress && originalEmailAddress === control.value) {
return Observable.of({});
}
return Observable.timer(1000).switchMap(() => {
return userService
.isEmailAddressUnique(control.value)
.map(result => (result ? null : { 'This email address is already in use': true }));
});
}
}
第二個幾乎相同的,除了它在userService調用該方法。 如何才能讓一個通用驗證工廠通過它應該調用的方法來進行實際檢查?
到目前爲止,我有這樣的:
public static createValidator(uniqueFn: (value: string) => Observable<Boolean>, originalEmailAddressFn:() => string, errorMessage: string) {
return (control: AbstractControl): Observable<ValidationErrors> => {
const originalEmailAddress: string = originalEmailAddressFn();
if (originalEmailAddress && originalEmailAddress === control.value) {
return Observable.of({});
}
return Observable.timer(1000).switchMap(() => {
return uniqueFn(control.value)
.map(result => (result ? null : { errorMessage: true }));
});
}
}
但我收到以下錯誤:
ERROR TypeError: Cannot read property 'restService' of undefined at webpackJsonp.../../../../../src/app/services/user/user.service.ts.UserService.isEmailAddressUnique (user.service.ts:108)
restService是在userService注入另一個服務。 它看起來依賴關係尚未解決。我該如何解決這個問題?
這是我userService:
// imports ...
@Injectable()
export class UserService {
// [...]
constructor(private restService: RestService) { }
isEmailAddressUnique(emailAddress: string): Observable<Boolean> {
return this.restService.get(this.usersUrl + '/validateUniqueEmailAddress/' + emailAddress);
}
}
你能告訴其中'使用restService'的代碼? – amal
當然。剛剛編輯我的問題 – Tim