非常によく似た2つの非同期バリデータがあります。両方とも一意性のチェック値:電子メールとイニシャル。サービスを非同期バリデータにインジェクトする方法は?
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の上で呼び出すメソッドを除いて、ほぼ同一の第2の1、:最初のものはこのようになります。 一般的なバリデータファクトリを1つ作成し、実際のチェックを行うために呼び出すメソッドを渡すにはどうすればよいですか?
はこれまでのところ、私はこれを持っている:
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