typescript - Angular2 访问全局服务而不将其包含在每个构造函数中

标签 typescript angular

我有三个类(class):

@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 中,即使 MediaService 继承了 BaseService,我也必须包括 BaseService MediaService 的构造函数。

如何将 Angular2 注入(inject)到 BaseService 中而不在 MediaService 的构造函数中注入(inject)它?

现在我拥有了所有继承自 BaseService 的类,这些类根据 ApiService 扩展 BaseService。

最佳答案

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

您可以做的是注入(inject) Injector 并将其转发给父类(super class),父类(super class)从 Injector 命令式请求 Http。如果您注入(inject)多个服务,这可能有点优势,因为您只需要声明一个构造函数参数,但在我看来,这使得对代码进行推理变得更加困难。

关于typescript - Angular2 访问全局服务而不将其包含在每个构造函数中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35206821/

相关文章:

angular - 从其他组件获取所有参数的访问权限?

angular - 如何将 Ionic 4 与 aspnetboilerplate 集成,而不会出现任何 typescript 错误?

javascript - typescript 命名空间引用不起作用

java - Angular 6 访问 REST 失败,Access-Control-Allow-Origin

angular - 从事件回调更新数组

javascript - Angular - 模块 AppModule 导入的意外值 MatDialog

javascript - 倒数计时器不循环工作和休息时间

angular - 通过单击单独的按钮来增加表单控件值

angular - 如何在 Angular Material 2 中下拉数量?

angular - 如何在单元测试用例中使用 Angular 2 中的文本找到正确的按钮