我正在将一个项目从 angular2 RC4 迁移到 RC6,并且我有一个自定义表单验证器,需要Http
。
在迁移之前我使用了ReflectiveInjector
与HTTP_PROVIDERS
,但是对于 RC6,这不再可能了,因为HTTP_PROVIDERS
已弃用,不再存在。
这是验证器中的静态方法:
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
with HttpModule
没用,我在 stackoverflow 上发现了类似的问题(NG2 RC5:HTTP_PROVIDERS 已弃用 https://stackoverflow.com/questions/38903607/ng2-rc5-http-providers-is-deprecated)关于测试,但唯一的答案是特定于测试的。
如何手动“注入”Http
or HttpModule
对于 RC6,如果这个自定义验证器有另一个或更好的解决方案,我也对此持开放态度。
提前致谢。
更新:
这checkVat
方法是静态的,这就是为什么我必须使用 ReflectiveInjector 而不仅仅是像其他地方一样通过构造函数注入它。
自定义验证器的使用方式如下:
this.vatCtrl = new FormControl("", Validators.compose([Validators.pattern(this.vatService.vatPattern)]),VatValidator.checkVat);
更新2:
在 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));
}