如何在Angular 6导出功能中使用依赖注入

时间:2018-11-26 10:39:37

标签: angular

我已经尝试过

export function uniqueUserNameValidation(commonsService: CommonsService): AsyncValidatorFn {
  return (c: AbstractControl): Promise < ValidationErrors | null > | Observable < ValidationErrors | null > => {
    return commonsService.uniqueUserName(c.value).pipe(
      map(data => {
        return data && data.status ? {
          'uniqueValidation': true
        } : null
      })
    )
  }
}

常用服务方法

uniqueUserName(name:string){
        return this.http.get<booleanData>(constDefault.API_URL+"/commons/nameAlreadyExist/"+name+"/Tank")
}

我收到此错误

  

core.js:1673错误错误:未捕获(按承诺):TypeError:无法   读取未定义的属性“ uniqueUserName”       TypeError:无法读取未定义的属性'uniqueUserName'

2 个答案:

答案 0 :(得分:1)

Angular的自动依赖项注入仅适用于angular组件构造函数(由DI系统管理)。

作为该问题中所示特定问题的解决方案,您可以将服务注入将要调用uniqueUserNameValidation的组件中,然后将该服务作为参数传递给uniqueUserNameValidation。我认为,总的来说,这将是解决您问题的首选方法,因为它不会偏离标准的角度做法。

示例

export class MyComponent {
  constructor(private commonsService: CommonsService, private fb: FormBuilder) {}

  ngOnInit() {
    const form = this.fb.group({
      name: ['', uniqueUserNameValidation(this.commonsService)]
    })
  }
}

答案 1 :(得分:0)

我认为您的CommonsService是适当的Angular服务。如果是这样,您可以使用Injector

首先导入Injector并在模块(app.module.ts等)和模块初始化实例的构造函数中声明:{p>

import {Injector} from '@angular/core';

export let InjectorInstance: Injector;

...
...
...


export class AppModule {

  constructor(private injector: Injector) {
    InjectorInstance = this.injector;
  }
}

然后在导出函数的文件中,从模块导入变量:

import {InjectorInstance} from 'path/to/app.module';

然后,您可以使用.get()的{​​{1}}方法来获取服务实例:

Injector