我正在将一个项目从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
有HttpModule
没有工作,我在这里找到了类似的问题上计算器(NG2 RC5:HTTP_PROVIDERS已被弃用)有关测试,但唯一的答案是具体的测试。
如果对此自定义验证器有其他或更佳的解决方案,我也应该手动进行“注入”Http
或HttpModule
使用RC6。
提前致谢。
更新:该checkVat
方法是静态的,这就是为什么我不得不使用ReflectiveInjector而不是像其他任何地方一样通过构造函数注入它的原因。自定义验证器的用法如下:
this.vatCtrl = new FormControl("", Validators.compose([Validators.pattern(this.vatService.vatPattern)]),VatValidator.checkVat);
UPDATE2:在GüntherZö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));
}
如果您稍微更改验证器类,则不需要静态方法
@Injectable()
class PatternValidator {
constructor(private http:Http){}
// this is a method that returns a validator function
// configured with a pattern
pattern(pattern) {
return (control:Control) => {
this.http.get(...)
...
}
}
}
您可以像这样使用它:
Http
)中传递其依赖项constructor(private pattern:PatternValidator) {}
bind(pattern)
以便.this
继续在验证器功能内工作this.vatCtrl = new FormControl("",
Validators.compose([
this.pattern(this.vatService.vatPattern).bind(this.pattern)
]), VatValidator.checkVat);
另请参阅以角度2手动注入Http
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句