Angular2 RC6 HttpModule手动注入 [英] Angular2 RC6 HttpModule manual injection
问题描述
我正在将项目从angular2 RC4迁移到RC6,并且我有一个需要Http
的自定义表单验证器.
在迁移之前,我将ReflectiveInjector
与HTTP_PROVIDERS
一起使用,但是对于RC6,由于不再支持HTTP_PROVIDERS
或不再存在,因此不再可行.
这是Validator中的静态方法:
I'm migrating a project from angular2 RC4 to RC6 and I have a custom Form Validator which needs Http
.
Before the migration I used the ReflectiveInjector
with the HTTP_PROVIDERS
, but with RC6 this is not possible anymore as HTTP_PROVIDERS
is deprecated, respectively not present anymore.
This is the static method in the 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上发现了类似的问题(
Just replacing HTTP_PROVIDERS
with HttpModule
didn't work, I found a similar problem here on stackoverflow (NG2 RC5: HTTP_PROVIDERS is deprecated) regarding testing, but the only answer is specific for testing.
如果对此自定义验证程序有另一种或更佳的解决方案,我也应该对此开放.
How do I manually "inject" Http
or HttpModule
with RC6, if there is another or better solution for this custom Validator I'm open to that too.
谢谢.
更新:
checkVat
方法是静态的,这就是为什么我不得不使用ReflectiveInjector而不是像其他任何地方一样通过构造函数注入它的原因.
自定义验证器的用法如下:
UPDATE:
The checkVat
method is static, that is why I had to use the ReflectiveInjector and not just inject it via the constructor, like everywhere else.
The custom Validator gets used like this:
this.vatCtrl = new FormControl("", Validators.compose([Validators.pattern(this.vatService.vatPattern)]),VatValidator.checkVat);
UPDATE2: 借助GüntherZöchbauer的答案,我对代码进行了如下更改,以使其在没有静态功能且无需手动注入的情况下工作:
UPDATE2: With the help of Günther Zöchbauer's answer I changed the Code as follows to get it working without a static function and no need for manual injection:
验证者:
@Injectable()
导出类VatValidator {
export class 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的组件中:
In the component which has the FormControl:
constructor(private vatValidator: VatValidator) {
this.vatCtrl = new FormControl("", Validators.compose([Validators.pattern(vatPattern)]), this.vatValidator.checkVat.bind(this.vatValidator));
}
推荐答案
如果稍微更改验证器类,则不需要静态方法
If you change your validator class a bit, you don't need a static method
@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(...)
...
}
}
}
您可以像这样使用它:
- 将其注入到您的组件中,以便DI在(
Http
)中传递其依赖项
- inject it to your component so DI passes it's dependencies in (
Http
)
constructor(private pattern:PatternValidator) {}
- 通过
bind(pattern)
传递它,以便.this
继续在验证器函数中工作 - pass it with
bind(pattern)
so.this
keeps working inside the validator function
this.vatCtrl = new FormControl("",
Validators.compose([
this.pattern(this.vatService.vatPattern).bind(this.pattern)
]), VatValidator.checkVat);
另请参阅 以角度2手动注入Http
这篇关于Angular2 RC6 HttpModule手动注入的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!