首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Angular2 RC6 HttpModule手动注射

Angular2 RC6 HttpModule手动注射
EN

Stack Overflow用户
提问于 2016-09-09 08:17:35
回答 3查看 1.7K关注 0票数 3

我正在将一个项目从angular2 RC4迁移到RC6,并且我有一个自定义表单Validator,它需要Http。在迁移之前,我在HTTP_PROVIDERS中使用了HTTP_PROVIDERS,但是对于RC6,这已经不可能了,因为HTTP_PROVIDERS已经被废弃了,不再存在了。这是Validator中的静态方法:

代码语言:javascript
复制
    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不起作用,我在这里发现了一个类似的关于测试的堆栈溢出(PROVIDERS is deprecated)问题,但是唯一的答案是针对测试的。

我如何手动“注入”HttpHttpModule与RC6,如果有另一个或更好的解决方案,这个定制的Validator,我也是开放的。

提前谢谢。

更新:checkVat方法是静态的,这就是为什么我必须使用ReflectiveInjector,而不是像其他地方一样通过构造函数注入它。使用自定义Validator的方式如下:

代码语言:javascript
复制
this.vatCtrl = new FormControl("", Validators.compose([Validators.pattern(this.vatService.vatPattern)]),VatValidator.checkVat);

UPDATE2:在Günther Z chbauer的回答的帮助下,我修改了代码如下,使它在没有静态功能的情况下工作,不需要手动注入:

捕食者:

代码语言:javascript
复制
@Injectable()

导出类VatValidator {

代码语言:javascript
复制
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的组件中:

代码语言:javascript
复制
    constructor(private vatValidator: VatValidator) {

    this.vatCtrl = new FormControl("", Validators.compose([Validators.pattern(vatPattern)]), this.vatValidator.checkVat.bind(this.vatValidator));

}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-09-09 09:45:32

如果稍微更改了验证器类,则不需要静态方法

代码语言:javascript
复制
@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)中传递它的依赖项
代码语言:javascript
复制
constructor(private pattern:PatternValidator) {}
  • 将它传递给bind(pattern),以便.this继续在验证器函数中工作。
代码语言:javascript
复制
this.vatCtrl = new FormControl("", 
    Validators.compose([
        this.pattern(this.vatService.vatPattern).bind(this.pattern)
    ]), VatValidator.checkVat);

另见Inject Http manually in angular 2

票数 2
EN

Stack Overflow用户

发布于 2016-09-15 04:42:09

代码语言:javascript
复制
import { ReflectiveInjector } from '@angular/core';
import { Http, XHRBackend, ConnectionBackend, BrowserXhr, ResponseOptions, XSRFStrategy, BaseResponseOptions, CookieXSRFStrategy, RequestOptions, BaseRequestOptions } from '@angular/http';

class MyCookieXSRFStrategy extends CookieXSRFStrategy {}

...

let http =  ReflectiveInjector.resolveAndCreate([
        Http, BrowserXhr, 
        { provide: ConnectionBackend, useClass: XHRBackend },
        { provide: ResponseOptions, useClass: BaseResponseOptions },
        { provide: XSRFStrategy, useClass: MyCookieXSRFStrategy },
        { provide: RequestOptions, useClass: BaseRequestOptions }
      ]).get(Http);

当然,你仍然需要HttpModule,享受吧!

票数 12
EN

Stack Overflow用户

发布于 2016-09-09 08:28:58

在RC5之后,你能做的就是,

代码语言:javascript
复制
import { HttpModule} from '@angular/http';
@NgModule({
  imports:      [ BrowserModule,HttpModule ],  //<------HttpModule
  declarations: [ AppComponent],
  providers:    [service],

  bootstrap:    [ AppComponent ]
})

在服役或工作中,

代码语言:javascript
复制
import { Http, Response } from '@angular/http';
@Injectable()
export class service{
  constructor(private http:Http){}           //<----inject here

  // use http here
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39406933

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档