プロジェクトを angular2 RC4 から RC6 に移行しています。必要なカスタム フォーム バリデーターがありますHttp
。移行前は を と一緒に使用しReflectiveInjector
ていましたHTTP_PROVIDERS
が、RC6 ではHTTP_PROVIDERS
非推奨であり、存在しないため、これはもはや不可能です。これは Validator の静的メソッドです。
static checkVat(control: FormControl) {
let checkVatUrl = "http://localhost:8080/checkvat";
let injector = ReflectiveInjector.resolveAndCreate([HTTP_PROVIDERS]);
let http = injector.get(Http);
let authHttp = new AuthHttp(new AuthConfig(), http);
if (control.value === "") {
return new Observable((obs: any) => {
obs.next(null);
obs.complete();
});
} else {
return authHttp.get(checkVatUrl + "/" + control.value)
.map((data: Response) => {
if (data.json().valid) {
return null;
} else {
let reason = "isNotValidVat";
return {[reason]: true};
}
})
.catch(function (e) {
return new Observable((obs: any) => {
obs.complete();
});
});
}
}
に置き換えるだけでは機能HTTP_PROVIDERS
しませんでした。テストに関して、 stackoverflow ( NG2 RC5: HTTP_PROVIDERS is deprecatedHttpModule
)で同様の問題を見つけましたが、唯一の答えはテストに固有のものです。
このカスタム Validator に別の解決策またはより良い解決策がある場合、手動で「注入」する方法、Http
またはHttpModule
RC6 を使用する方法を教えてください。
前もって感謝します。
更新:checkVat
メソッドは静的です。そのため、ReflectiveInjector を使用する必要があり、他の場所と同様に、コンストラクターを介して注入するだけではありません。カスタム Validator は次のように使用されます。
this.vatCtrl = new FormControl("", Validators.compose([Validators.pattern(this.vatService.vatPattern)]),VatValidator.checkVat);
UPDATE2: Günther Zöchbauer の回答の助けを借りて、次のようにコードを変更して、静的関数なしで動作し、手動インジェクションを必要としないようにしました。
バリデーター:
@Injectable()
輸出クラスVatValidator {
constructor(private http: Http) {
}
checkVat(control: FormControl) {
let checkVatUrl = "http://localhost:8080/checkvat";
let authHttp = new AuthHttp(new AuthConfig(), this.http);
if (control.value === "") {
return new Observable((obs: any) => {
obs.next(null);
obs.complete();
});
} else {
return authHttp.get(checkVatUrl + "/" + control.value)
.map((data: Response) => {
if (data.json().valid) {
return null;
} else {
let reason = "isNotValidVat";
return {[reason]: true};
}
})
.catch(function (e) {
return new Observable((obs: any) => {
obs.complete();
});
});
}
}
}
FormControl を持つコンポーネントで:
constructor(private vatValidator: VatValidator) {
this.vatCtrl = new FormControl("", Validators.compose([Validators.pattern(vatPattern)]), this.vatValidator.checkVat.bind(this.vatValidator));
}