【问题标题】:The semantics of @Injectable(providedIn: 'root')?@Injectable(providedIn: 'root') 的语义?
【发布时间】:2021-03-15 02:10:31
【问题描述】:

只是想确保我理解 @Injectable(providedIn: 'root') 的语义。 在 Angular 6 之前,如果我们从 NPM 导入一个包含服务的模块,我们将在我们的应用程序模块中声明该模块,以便整个应用程序都可以访问该服务。像这样的:

    import { SomeNPModule } from '@ngx/SomeNPModule';

    @NgModule({
    imports: [
        BrowserModule,
        SomeNPModule
    ]
    })
    export class AppModule {}

现在我们可以注入模块提供的SomeService,因为我们已经导入了模块。使用Angular 6,将SomeNPModule导入AppModule的需要被删除,因为我们在服务本身上使用@Injectable(providedIn: 'root),并且当注释运行时它会自动使服务在root注入容器中可用?

更新

所以我们有了答案,但我认为它是部分完成的,如果我们想要配置服务,这通常是通过服务模块上的 forRoot 方法完成的......就像通过Router。所以假设我们不想配置服务,我们需要做的就是注入它,但是如果我们想要一个配置的服务,我们需要遵循Router 模式。如果我在 cmets 中犯了任何错误,请纠正我。

【问题讨论】:

    标签: angular typescript progressive-web-apps angular-providers angular-dependency-injection


    【解决方案1】:

    当您编写@Injectable(providedIn: 'root') 时,这意味着该服务在整个应用程序中处于单一状态,您可以在应用程序的任何位置注入。

    当您只想为一个确切的模块制作服务单例时,您需要将您的模块作为参数分配给providedIn - @Injectable(providedIn: MyModule)

    使用@Injectable 装饰服务所需的唯一其他操作是导入它并构造函数注入它,仅此而已。无需在AppModule中导入。

    【讨论】:

    • 是的,使用 Angular 6 provideIn 属性不再需要将其添加到提供程序中
    • @SurenSrapyan 对于您只希望服务成为整个应用程序的单例的任何情况都是如此。但是,如果你想要一个服务在不同模块或组件中的唯一实例,你仍然需要使用 providers 数组。
    • 您可以在providedIn参数中提供模块的名称,它将仅添加到该模块。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-01
    • 2018-11-24
    • 2020-05-10
    • 2018-11-02
    • 2019-04-15
    • 2023-02-21
    相关资源
    最近更新 更多