2016-12-14 14 views
1

非同期カスタムバリデーターを作成して、EmployeeIdがすでにフォームに存在するかどうかを確認しようとしています。そのために私はカスタムバリデーターを作成し、Web APIを呼び出すためのサービスを実装しました。私はこれを行う方法を未定義非同期検証 - 角度2のカスタム検証からサービスにアクセスできません

誰でも持つアイデアのプロパティ「サービス」を読み込めませんと言って、私はエラーを得た社員を検索しようとした

..

カスタムバリデータ

import { FormControl } from '@angular/forms' 
import { HttpService } from '../Services/app.service'; 

export class EmployeeValidators { 

constructor(private service: HttpService) { } 

EmpIdCheck(control: FormControl) { 

     this.service.LoginCheck(control.value).subscribe(
      data => { 
       if (data.length == 0 || data.length == 1) { 
        resolve(null); 
       } else { 
        resolve({ EmpIdCheck: true }); 
       } 
      }, 
      err => { 
       resolve({ EmpIdCheck: true }); 
      } 
     ) 
    }); 
} 

}

コンポーネント

export class LoginComponent { 
    myForm: FormGroup; 
constructor(private _HttpService: HttpService, private fb: FormBuilder) { 
    this.myForm = fb.group({ 
     empId: ['', Validators.compose([Validators.required, Validators.pattern("^[0-9]*$"), Validators.minLength(5), Validators.maxLength(5)]), new EmployeeValidators(this._HttpService).EmpIdCheck], 
     password: ['', Validators.compose([Validators.required, Validators.minLength(6), Validators.maxLength(10)])] 
    }); 
} 

サービス

@Injectable() 
    export class HttpService { 
public LoginCheck = (datas): any => { 
    let body = JSON.stringify({ datas }); 
    return this._http.post(this.actionUrl, datas, {headers: this.headers}).map(this.extractData) 
     .do(data => console.log(data)) 
     .catch(this.handleError); 
} 
private extractData(res: Response) { 
    let body = res.json(); 
    return body.Data || {}; 
} 

private handleError(error: Response) { 
    console.log(error) 
    return Observable.throw(error.json() || "server error") 
} 
} 

答えて

0
私はこの問題は、DIについてだと思う、あなたはのパラメータとしてデ依存関係を注入しようとすることができ、私は new EmployeeValidators(this._HttpService).EmpIdCheck

でValidatorの関数呼び出しを変更します

関数を呼び出して、このようなValidatorを呼び出します(既にValidator.compose内に追加することもできますし、既に持っているように呼び出すこともできます):

this.myForm = fb.group({ 
     empId: ['', Validators.compose([Validators.required, Validators.pattern("^[0-9]*$"), Validators.minLength(5), Validators.maxLength(5),EmployeeValidators.EmpIdCheck(this._HttpService)])], 
     password: ['', Validators.compose([Validators.required, Validators.minLength(6), Validators.maxLength(10)])] 
    }); 

また、サービスをコンポーネントのプロバイダとして追加する必要があると思いますが、カスタムバリデータでプロバイダとして使用することをお勧めします。関数。

あなたはここにこの詳細を読むことができます:

https://auth0.com/blog/angular2-series-forms-and-custom-validation/

http://restlet.com/blog/2016/02/17/implementing-angular2-forms-beyond-basics-part-2/

私は、これはあなたを助けることができると思います。

関連する問題