angular - @Injectable(providedIn: 'root') 的语义?
问题描述
只是想确保我理解@Injectable(providedIn: 'root')
. 在 Angular 6 之前,如果我们从 NPM 导入一个包含服务的模块,我们将在我们的应用程序模块中声明该模块,以便整个应用程序都可以访问该服务。像这样的东西:
import { SomeNPModule } from '@ngx/SomeNPModule';
@NgModule({
imports: [
BrowserModule,
SomeNPModule
]
})
export class AppModule {}
现在我们可以注入SomeService
模块提供的,因为我们已经导入了模块。SomeNPModule
在Angular 6 中,不需要导入),AppModule
因为我们@Injectable(providedIn: 'root
在服务本身上使用 ),并且当注解运行时,它会自动使服务在root
注入容器中可用?
更新
所以我们有了答案,但我认为它是部分完成的,如果我们想要配置服务,这通常是通过forRoot
服务模块上的方法完成的......就像通过Router
. 所以假设我们不想配置服务,我们需要做的就是注入它,但是如果我们想要一个配置的服务,我们需要遵循Router
模式。如果我在评论中犯了任何错误,请纠正我。
解决方案
当你写@Injectable(providedIn: 'root')
这意味着整个应用程序的服务是单一的,你可以在应用程序的任何地方注入。
当您只想为一个确切的模块制作服务单例时,您需要将您的模块作为参数分配给providedIn
-@Injectable(providedIn: MyModule)
使用装饰服务所需的唯一其他操作@Injectable
是导入它并构造函数注入它,仅此而已。无需在AppModule
.
推荐阅读
- wordpress - 关于 wp-job manager 公司简介永久链接的问题
- javascript - 如何调整官方 Vue 过滤器示例以使用 Vuetify 的`v-text-field`
- node.js - 如何检查sails.js 请求中是否有特定参数?
- angular - 检测何时将 Angular 组件添加到新的 ViewContainerRef
- java - Feign AuthRequest
- ruby - 我想看到真实的图像,而不是图标
- c# - 在同一解决方案中部署多个项目
- android - 如何在cardview android studio中制作运行文本?
- javascript - 无论是哪种日期格式,如何使用 JavaScript 验证输入字段?
- html - 标题部分中的文本定位