1

我正在阅读这篇文章,它@Injectable@Inject以下内容:

问题解决了。事实上,这正是@Inject 在不使用 TypeScript 进行编译时的用途。如果我们现在看一下转译的代码,我们会看到所有需要的元数据都已生成(是的,简化了)。

...

我们基本上可以将任何装饰器放在我们的代码中,只要它附加到类声明或构造函数参数即可。换句话说,我们可以再次删除 @Inject 并使用我们放在类上的其他东西,因为这将导致 TypeScript 也为构造函数参数发出元数据......幸运的是,Angular 附带了另一个我们可以使用的装饰器。@Injectable 通常用于 Dart 元数据生成。它在 TypeScript 领域没有任何特殊含义,但事实证明它非常适合我们的用例。

那么,我的理解是否正确,即:

  1. 如果一个类被用作其他类的可注入但不依赖于任何其他类,则在构造函数中既不需要@Injectable 也不需要@Inject
  2. 如果一个类依赖于任何其他类并且没有使用任何装饰器,则它需要@Injectable()装饰器
  3. 如果 TS 和 一起使用emitDecoratorMetadata:true@Inject装饰器是没有用的
  4. 如果不使用 TS 或与 TS 一起使用emitDecoratorMetadata:false@Inject是指定依赖关系的唯一机制
4

1 回答 1

2
  1. 是的,AFAIK(“依赖于任何其他类”见下文,除了类之外还有其他类型的依赖项)

  2. 是的,但使用@Injectable()AFAIK 是首选。

  3. @Inject()当参数的类型与提供者注册的类型不匹配时,是必需的。

providers: [
  MyService,
  {provide 'myservice', useClass: MyService},
  {provide myserviceOpaqueToken, useClass: MyService},
]
constructor(private myService:MyService) {} // no @Inject() required
constructor(@Inject('myservice') private myService:MyService) {} //  @Inject() used to lookup the provider by string name
constructor(@Inject(myserviceOpaqueToken) private myService:MyService) {} //  @Inject() used to lookup the provider by OpaqueToken

这也揭示了您在其他陈述中的一些误解。类可以依赖于其他参数而不是其他类

providers: [
  {provide 'myconfigvalue', useValue: '42'},
]

constructor(@Inject('myconfigvalue') private myConfigValue:string) {}   
  1. 还有static get parameters() { ... }用于指定依赖项的 getter。我想这对于在 ES5/6 中使用 Angular2 仍然有效(我自己从未使用过)

https://medium.com/@blacksonic86/angular-2-dependency-injection-in-es6-f5551a3d6bf#.kgxjvcinv

@Component({
  selector: 'app',
  template: `
    <ul>
      <li *ngFor="#city of getCities()">{{ city }}</li>
    </ul>
  `
})
class AppComponent {
  static get parameters() {
    return [[CityService]];
  }

  constructor(cityService) {
    this._cityService = cityService;
  }

  getCities() {
    return this._cityService.getCities();
  }
}
于 2017-01-23T08:17:37.733 回答