【问题标题】:Use classes in component and dependency injection在组件和依赖注入中使用类
【发布时间】:2018-12-04 00:41:55
【问题描述】:

我使用 Angular 并拥有 1 个组件、1 个类和 1 个服务。

我的服务是一个@injectable 类,并且在 app.module.ts 中设置得很好。

@Injectable()
export class MyService {

我的班级将服务作为依赖注入来获取。

import { MyService } from '../services/myService';

export class MyClass {
  constructor(
    myService: MyService
  ) {

在组件构造函数中,我尝试为我的类 MyClass 创建一个新实例。

export class MyComponent implements AfterViewInit {
  constructor(
  ) {
    const myClass = new MyClass();
  }

但我得到:“预期 1 个参数,但得到 0”。

所以我的问题是如何使用类并享受依赖注入?我对此一无所知。

或者,我必须在我的组件构造函数中添加依赖并将它们传递给我的类?

也许是更好的混合方式?

提前致谢,

【问题讨论】:

  • 我认为这个答案应该可以帮助你stackoverflow.com/a/41433007/3153226
  • 谢谢,但我已经读过了,但不是我的情况,我想要一个自定义类,这个类可以从 DI 中受益。

标签: angular class dependency-injection


【解决方案1】:

在您执行此操作之前需要了解一些要点。

1) 您想与您的类和组件共享同一个服务实例吗?

如果是,那么您可以在您的 COMPONENT 中“提供”该服务,并将该服务的实例传递给您的 CLASS。

@Component({
  selector: '',
  templateUrl: '',
  providers: [Provide your service here]
})
export class MyComponent implements AfterViewInit {
  constructor(serv: MyServ){
    const myClass = new MyClass(serv);
  }
}

请注意,如果您已经在模块中提供了服务,则无需在组件中再次提供。

这样做的好处是您现在与您的类和组件共享同一个服务实例。

2) 如果您不想共享该实例,您可以简单地在您的类构造函数中创建一个新的服务实例。

import { MyService } from '../services/myService';

export class MyClass {
  constructor(myService: MyService = new MyService()) {

  }
}

在这里,您为类构造函数提供了一个默认参数。因此,如果有人(在您的情况下为组件)传递服务实例,它将使用它,否则它将创建它自己的实例。

【讨论】:

  • 您好,感谢您的回答,您的第 1 点接近我想要的,但问题是是否可以不通过所有现在不需要 DI 的类传递服务。并且我的情况不需要提供者,组件只是我的启动点。
  • 更明确地说,就像我的组件是游戏的引导程序,我想启动引擎,但第一类不必实例化所有服务并通过所有类直到类端点。所以我相信 DI 做可选参数并自动填充。
  • 嗨,不,这是不可能的。依赖注入按顺序工作,您的类不是由角度实例化的。由于您自己实例化了类,因此如果为您的类注入依赖项,则无法利用
  • 好的,谢谢。因此,如果我破坏多个级别的类,我必须传递所有需要的服务,并且不能像全局容器那样受益。
  • 是的,这就是组件的概念。所以基本上只有当你在 Angular 序列中做一些事情时,DI 才能被利用。任何具有依赖关系的显式类都应显式提供该依赖关系
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-08
  • 1970-01-01
  • 1970-01-01
  • 2011-01-13
相关资源
最近更新 更多