为什么我不能在Consularutor Angular2之外宣布DI?

时间:2017-08-07 08:11:39

标签: angular typescript dependency-injection constructor

我有一个由服务实例化的类(但不是服务本身)并且需要多个服务才能工作。 如果我在构造函数之外声明我需要的每个服务,我会收到一个错误,告诉我我的服务是未定义的。

我如何称呼它:

export class MapContentService {
  public accidentMap: AccidentMapContent;
  ...    
  constructor(private httpRequestService: HttpRequestService, private translate: TranslateService, private conf: ConfigurationService) { }
  ...
  public getMapContent(): Promise<MapContentInterface> {
    ...        
    this.accidentMap = new AccidentMapContent(this.httpRequestService, this.translate, this.conf);
  }

它是如何工作的:

export class AccidentMapContent implements MapContentInterface {
  ...
  private conf: ConfigurationService;
  private translate: TranslateService;
  private httpRequestService: HttpRequestService;
  ...
  constructor( httpRequestService: HttpRequestService, translate: TranslateService, conf: ConfigurationService) { 
    this.conf = conf;
    this.translate = translate;
    this.httpRequestService = httpRequestService;
  }

工作原理:

export class AccidentMapContent implements MapContentInterface {
  ...    
  constructor(private httpRequestService: HttpRequestService, private translate: TranslateService, private conf: ConfigurationService) { }
如果我们遵循构造函数逻辑,

通常都可以正常工作。我不明白为什么它被覆盖了。请参阅这篇文章:declare properties in constructor angular 2这两种方法没有区别。

有人可以解释一下这是什么原因吗?

谢谢。

1 个答案:

答案 0 :(得分:0)

我终于找到了发生的事情。 感谢@JB Nizet的评论,我做了进一步的调查。其中一个变量是使用其中一个服务启动的。

当我在构造函数参数中声明服务时,服务将可用于初始化变量,否则,当我在构造函数中声明服务时,变量初始化将在服务初始化导致崩溃之前发生:

export class AccidentMapContent implements MapContentInterface {
  ...
  // The faulty line : 
  private icon: MapPointIcon = new MapPointIcon(this.conf.mapConf.ICON_SIZE, this.conf.mapConf.ICON_OFFSET, this.conf.mapConf.ICON_URL);
  ...    
  constructor(private httpRequestService: HttpRequestService, private translate: TranslateService, private conf: ConfigurationService) { }

解决方案:我也将变量初始化移动到构造函数。