Angular 2 @Injectable() - 它是如何工作的

7
我正在尝试理解在Angular 2服务中添加@Injectable()装饰的必要性。
从文档中得知:https://angular.io/docs/ts/latest/guide/dependency-injection.html
"为什么我们不在HeroesComponent中添加@Injectable()? 如果我们真的想添加它,我们可以这样做。因为HeroesComponent已经使用@Component进行了装饰。 TypeScript会为任何使用装饰器的类生成元数据,而任何装饰器都可以胜任。"
所以基本上只有在没有其他类型的装饰可用时才需要添加@Injectable(),因为如果有任何类型的装饰可用,TypeScript编译器将基于您在构造函数中传递的变量自动生成依赖信息,例如:constructor(private logger: Logger)。
这正确吗?谢谢

5
我在@alexpods那里笑了。把它作为回答添加进去怎么样:D?为了补充一点,你可以阅读这个评论,整个问题很有趣,但与你的问题并不完全相关。 - Eric Martinez
1个回答

9
我认为这个名称有点奇怪,我真的不明白为什么他们告诉你要添加它以获得最佳实践。如果将其添加到每个类中是最佳实践,我不明白为什么需要它。如果框架可以检查每个类的构造函数是否需要注入内容,那将更容易。这可以通过在TypeScript上设置命令行属性来始终生成(模拟)元数据来解决。
我猜一直添加它的建议类似于编译器始终添加元数据的建议(据我所知不可能)。您也可以(小心谨慎地)仅对需要注入内容的类进行添加 - 即使它们具有另一个装饰器。这可能是最明确的解决方案 - 但是嘿 - 粗心可能既是坏事也是好事。在这种情况下,您将成为裁判。
简而言之,如果您没有其他装饰器并且您的构造函数需要注入服务/等等,则需要添加它。

1
澄清一下,对于那些从“Injectable”(例如,“Component”等)扩展的其他类装饰器或者那些构造函数属性被注释为“Inject”的类(例如,在ES.next代码中),不需要这样做。 - Estus Flask

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接