@Injectable(providedIn:'root')的语义是什么?

时间:2018-08-23 16:17:00

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

只想确保我了解@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模式。如果我在评论中有任何错误,请纠正我。

1 个答案:

答案 0 :(得分:8)

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

如果只想为一个确切的模块设置服务单例,则需要将模块作为参数分配给providedIn-@Injectable(providedIn: MyModule)

要使用装饰有@Injectable的服务,唯一需要执行的其他操作就是将其导入,然后构造函数将其注入,仅此而已。无需将其导入AppModule