在Angular CLI中生成服务时,它将为Injectable装饰器添加带有“提供的”属性且默认值为“ root”的额外元数据。
@Injectable({
providedIn: 'root',
})
ProvideIn到底做什么?我假设这使服务像整个应用程序的“全局”类型单例服务一样可用,但是,在AppModule的提供程序数组中声明这样的服务会更干净吗?
更新:
对于其他任何人,以下段落也对此提供了另一个很好的解释,特别是如果您只想为功能模块提供服务。
现在有一种推荐的新方法,可以
@Injectable()
使用newprovidedIn
属性在装饰器内部直接注册提供程序。它接受'root'
作为值或您的应用程序的任何模块。使用时'root'
,您injectable
将在应用程序中注册为单例,而无需将其添加到根模块的提供者中。同样,如果使用providedIn: UsersModule
,injectable
注册为的提供者,UsersModule
而不会将其添加到providers
模块的。” -https://blog.ninja-squad.com/2018/05/04/what-is-new-angular -6 /
更新2:
经过进一步调查,我认为只有 providedIn: 'root'
如果要provide
在根模块以外的任何模块中使用服务,则最好使用providers
功能模块装饰器中的数组,否则将遇到循环依赖关系。这里有趣的讨论-https: //github.com/angular/angular-cli/issues/10170