角度6依赖注入

新手上路,请多包涵

在最新版本的 Angular 6 中,使用服务元数据中的 providedIn 属性在模块中注册服务:

 @Injectable({
  providedIn: 'root',
})
export class HeroService {}

然而,文档仍然提到在模块元数据中的模块 providers 数组中注册服务,就像我们在 Angular 5 中所做的那样:

 @NgModule({
  providers: [HeroService],
})
export class AppModule {}

所以,

  • 应该使用哪种方法让注入器知道它应该注入的服务?
  • 模块 providers 数组方法是否会被弃用?

原文由 Hamed Baatour 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 254
2 个回答

基本上你可以使用任何一种,但根据新的 CLI provideIn 将在创建时自动添加 service

#providedIn

现在有一种新的推荐方法来注册提供者,直接在 @Injectable() 装饰器中,使用新的 providedIn 属性。它接受 'root' 作为应用程序的值或任何模块。当您使用 'root' 时,您的注入将在应用程序中注册为单例,您无需将其添加到根模块的提供者中。同样,如果您使用 providedIn: UsersModule ,则注射剂将注册为 UsersModule 的提供者,而无需将其添加到模块的提供者中。

引入这种新方法是为了在应用程序中实现更好的 tree-shaking。目前,添加到模块提供者的服务将在最终捆绑包中结束,即使它没有在应用程序中使用,这有点可悲。

有关更多信息,请参阅此处

原文由 Pardeep Jain 发布,翻译遵循 CC BY-SA 4.0 许可协议

与往常一样,当有多种解决方案可用时,这取决于您想要实现的目标。但是 文档 给了你一些选择的指导。

有时在应用程序根注入器中始终提供服务是不可取的。也许用户应该明确选择使用该服务,或者应该在延迟加载的上下文中提供该服务。在这种情况下,提供者应该与特定的 @NgModule class 相关联,并且将由包含该模块的任何注入器使用。

所以基本上您将使用 providedIn: 'root' 用于应用程序范围内的任何服务。对于其他服务,请继续使用旧版本。

不要忘记,您已经可以选择提供不同的服务。例如,也可以在组件级别声明 Injectable(这在 V6 中没有改变)。

   @Component({
    selector: 'app-my-component',
    templateUrl: './my.component.html',
    providers: [ MyService ]
  })

这样,该服务仅在 MyComponent 及其子组件树中可用。

原文由 JEY 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题