如何将常见的依赖项注入其他Angular2 @Injectable类?

时间:2017-09-02 23:06:34

标签: angular typescript dependency-injection

我在TypeScript中创建了一个组件库,我想分享许多服务。

export abstract class ComponentBase<T> {
  constructor(protected http:Http, protected router: Router, protected route: ActivatedRoute, protected params: Params) {
  }
}

问题是我有多个嵌套类型,所以每当我必须在层次结构中派生任何级别时。每个派生类型都会看起来像这样传递基数的注入参数。

import { Http } from '@angular/http';
import { Router, ActivatedRoute, Params } from '@angular/router';
export  class SomeDerivedType extends ComponentBase<SomeType> {
  constructor(protected http: Http, protected router: Router, protected route: ActivatedRoute, protected params: Params) {
    super(http, router, route, params);
  }
}

我必须链接我的构造函数以满足基类的构造函数参数。这是非常烦人的开销。因此,我创建了一个Services类来保存所有封装的依赖项。

import { Injectable } from '@angular/core';
import { Router, ActivatedRoute, Params } from '@angular/router';
import { Http } from "@angular/http";

@Injectable()
export class Services {
  constructor(public http:Http, public router: Router,  public route: ActivatedRoute, public params: Params) {
  }
}

我认为我应该能够将这个服务类注入到组件中,如下所示。

import { Services } from './services'
export class SomeDerivedType extends ComponentBase<any> {
  constructor(protected services: Services) {
    super(services);
  }
}

现在组件库看起来如下:

import { Services } from './services';
import { Http } from '@angular/http';
import { Router, ActivatedRoute, Params } from '@angular/router';

export abstract class ComponentBase<T> {
  http: Http;
  router: Router;
  route: ActivatedRoute;
  params: Params;
  constructor(protected services: Services ) {
    this.http = services.http;
    this.route = services.route;
    this.router = services.router;
    this.params = services.params;
  }
}

遗憾的是,这对我不起作用,而是出现以下错误:

  

(index):63错误:错误:无法解析服务的所有参数:   ([object Object],[object Object],[object Object],?)。

所以,自然我的问题是,“有没有办法让依赖服务(即http,路由器,路由和参数服务)注入我的服务类?”

1 个答案:

答案 0 :(得分:1)

好吧,事实证明我错过了一些关于棱角分明的东西,这对我来说并不清楚。我只使用了一段时间。问题实际上很简单。 Params不是一项服务。

(index):63错误:错误:无法解析服务的所有参数:([object Object],[object Object],[object Object] ,?)。

这条消息让我失望,因为它说不能解决所有问题。我误解了它,因为它确实告诉我其中一个参数没有得到解决。在我的案例中受保护的params:Params。

此代码现在可以正常工作,就像我希望删除params项一样。