Angular2 RC6 HttpModule手动注入

我正在将一个项目从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_PROVIDERSHttpModule没有工作,我在这里找到了类似的问题上计算器(NG2 RC5:HTTP_PROVIDERS已被弃用)有关测试,但唯一的答案是具体的测试。

如果对此自定义验证器有其他或更佳的解决方案,我也应该手动进行“注入”HttpHttpModule使用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));

}
贡特·佐赫鲍尔(GünterZöchbauer)

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

@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)中传递其依赖项
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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章