【问题标题】:The clear meaning of the decorator @Injectable in Angular 5+Angular 5+中装饰器@Injectable的明确含义
【发布时间】:2018-07-27 01:58:10
【问题描述】:

据我所知,一个类可以使用诸如@Injectable@Component 之类的装饰器从 Angular 注入器注入依赖项。

所以我认为 @Injectable 装饰器是某种“徽章”,告诉 Angular “我(类)允许你注入我请求的依赖项”,我相信这是正确的。

但是官方文档中的这句话让我很困惑:

@Injectable()
export class UserContextService {}

@Injectable 装饰器表明 Angular DI 系统用于创建一个或多个 UserContextService 实例。

据我所知,@Injectable 装饰器与创建类实例的注入器无关。

我错过了什么吗?

附: The official document link for the sentence above

【问题讨论】:

    标签: angular


    【解决方案1】:

    有趣的是,这个文档是错误的。 @Injectable 实际上意味着“我(服务)可以将其他服务注入我”。考虑这个名为Service2 的服务,它试图将Service1 注入到构造函数中:

    // If you remove this, you will get an error
    @Injectable()
    export class Service2 {
      constructor(private service: Service1) { 
    
      }
    }
    

    正如评论所指出的,删除 @Injectable() 会引发错误。您可以使用StackBlitz I created 进行尝试。不过,组件不需要@Injectable() 来注入服务。

    我找到了an issue where this was discussed,但似乎没有任何东西来自它。想一想,我从表面上看文档,并且一直在错误地使用@Injectable()。感谢您提出这个问题。

    这促使我更深入地挖掘并查看文档引用的测试。它失败了,但不是因为文档说它失败了。他们实际上有一个测试来验证你可以注入一个没有装饰器的服务。我为好奇的here写了更多信息。

    【讨论】:

    • 我不认为这是正确的。 Angular 注入器完全能够在没有 @Injectable 装饰器的情况下注入一个类的实例。当一个类请求一个没有装饰器的依赖项时,Angular 会抛出一个错误。
    • stackblitz.com/edit/… 我已经为此编写了一个测试。如您所见,Test1Service 没有 @Injectable 装饰器,但AppComponent 的注入器完美地注入了它的一个实例,没有任何问题。
    • 嘿@DongBinKim 阅读您的评论后,我编写了完全相同的测试应用程序并得出相同的结论并找到了答案。文档是错误的。我将编辑我的答案。
    • 很高兴讨论它:D 谢谢!
    猜你喜欢
    • 1970-01-01
    • 2019-12-21
    • 1970-01-01
    • 1970-01-01
    • 2020-06-08
    • 2017-01-08
    • 2018-10-22
    • 1970-01-01
    • 2022-11-14
    相关资源
    最近更新 更多