2017-09-14 12 views
1

非常によく似た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); 
    } 
} 
+0

あなたは 'restService'が使用されているコードを表示することができますか? – amal

+0

もちろん。ちょうど私の質問を編集しました – Tim

答えて

1

はEDIT: の両方が機能の所望の数を誤解し、完全には説明しませんでした。おおよその設定に一致する(わずかに単純化された)プランカーを作成する時間をとった(APIをチェックするのではなく、単に電子メールが有効かどうかをチェックするだけでObservableとしてチェックする)、さらにはcreateValidator重要な工場に焦点を合わせる)。

私はworking versionnon-working versionを作成しました。後者は、実行したときに表示されていたエラー(Cannot read property 'restService' of undefined)を正常に再現します。破損の変更については、src/user.service.tsを参照してください。そして、私は、適切にthisを束縛するために太い矢印の宣言を使うことが重要な2つの機能を強調するために、以下を更新しました。私が過ぎ去ってしまったことがあれば、私に知らせてください。フォークで一緒に作業することもできます。脂肪矢印宣言を使用するための

重要な機能:

public static = createValidator(/*same parameters*/) => { 
    // same content 
} 

public isEmailAddressUnique = (/*same parameters*/) => { 
    // same content 
} 
+0

これは私がどのように役立つか分かりません。私は、サービスへのメソッド参照を与えることができる単一のcreateValidatorメソッドで終わりたいと思います。 – Tim

+0

あなたは非常に正しいです。それはあまり説明ではなく、私が最終的に望む工場の機能を正しく理解していませんでした。私は私の答えを更新し、また上にリンクされたやや単純化された塊にしばらく時間を費やしました。動作していないバージョンを確認してエラーを再現してください。また、動作しているバージョンでは、強調表示しようとしていた関数宣言を確認できます。 –