Angular2访问全局服务,但不在每个构造函数中包含它

时间:2016-02-04 16:49:33

标签: typescript angular

我有三个班级:

@Injectable()
export class ApiService {
  constructor(public http: Http) {}

  get(url: string) {
    return http.get(url);
  }

}

@Injectable()
export abstract class BaseService {
  constructor(protected serv: ApiService) {}  
}

@Injectable()
export class MediaService extends BaseService {

  // Why do we need this?
  constructor(s: ApiService) {
    super(s)
  }

  makeCall() {
    this.serv.get("http://www.example.com/get_data")
  }

}

在Angular2中,我必须包含BaseService MediaService的构造函数,即使MediaService继承了BaseService。

如何在没有MediaService构造函数的情况下将Angular2注入BaseService?

现在我将所有类扩展BaseService,这取决于ApiService从BaseService继承的时间。

3 个答案:

答案 0 :(得分:1)

如果你想通过DI传递它,你必须使用构造函数。构造函数不是继承的,因此您需要在每个子类中实现构造函数,并通过调用super(arguments)将参数传递给超类构造函数。 唯一的例外是默认构造函数,没有任何自动生成的参数。

您可以做的是注入Injector并将其传递给超类,其中超类要求Http强制要求Injector。如果你注入多个服务,这可能有点优势,因为你只需要声明一个构造函数参数,但在我看来,这使得更难以推断代码。

答案 1 :(得分:1)

我认为这不是支持的东西。这是依赖注入在Angular2中的工作方式,即基于装饰器。 latter使用关联类的构造函数来确定必须注入的内容。您必须意识到TypeScript本身支持class和extends的概念,但这些代码被转换为JavaScript。

有关已转换代码的更多详细信息,请参阅此答案:

希望它可以帮到你, 亨利

答案 2 :(得分:0)

对于未来的读者,here是使用服务定位器解决此问题的示例的答案。