【发布时间】:2017-01-17 07:56:06
【问题描述】:
我正在将一个项目从 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();
});
});
}
}
只是用HttpModule 替换HTTP_PROVIDERS 不起作用,我在stackoverflow (NG2 RC5: HTTP_PROVIDERS is deprecated) 上发现了一个关于测试的类似问题,但唯一的答案是特定于测试的。
我如何使用 RC6 手动“注入”Http 或 HttpModule,如果此自定义验证器有其他或更好的解决方案,我也愿意。
提前致谢。
更新:
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));
}
【问题讨论】:
-
为什么需要
let injector = ReflectiveInjector.resolveAndCreate([HTTP_PROVIDERS]);而不仅仅是constructor(private http:Http){}? -
因为
checkVat是静态的。我会将这种方法的使用添加到我的问题中。 -
为什么需要是静态的?
-
如果我将此函数设为非静态并创建
VatValidator的实例,则此方法的调用(显示在问题的更新中)对我不起作用。checkVat的参数是 Validator 应用到的 FormControl,如果我使用实例 (vatValidator) 并像这样调用方法:vatValidator.checkVat(this.vatCtrl)由于参数,编译器不喜欢那样。这是一个 AsyncValidator。
标签: angular typescript angular2-forms angular2-injection