首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >角6依赖注入

角6依赖注入
EN

Stack Overflow用户
提问于 2018-05-07 06:58:41
回答 5查看 28.4K关注 0票数 66

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

代码语言:javascript
复制
@Injectable({
  providedIn: 'root',
})
export class HeroService {}

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

代码语言:javascript
复制
@NgModule({
  providers: [HeroService],
})
export class AppModule {}

所以,

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

回答 5

Stack Overflow用户

回答已采纳

发布于 2018-05-07 07:12:11

基本上您可以使用这两种方法,但是按照新的CLI,provideIn将在创建service时自动添加。

#供应

现在有一种新的、推荐的注册提供程序的方法,直接在@Injectable()装饰器中,使用新的providedIn属性。它接受'root'作为应用程序的值或任何模块。当您使用'root'时,您的可注入性将在应用程序中注册为单例,并且不需要将其添加到根模块的提供程序中。类似地,如果使用providedIn: UsersModule,则可以将可注入性注册为UsersModule的提供程序,而无需将其添加到模块的提供程序中。 这种新的方法在应用中得到了更好的树振。目前,添加到模块提供程序中的服务将在最后一个包中结束,即使它没有在应用程序中使用,这有点令人难过。

欲了解更多信息,请参阅此处

票数 88
EN

Stack Overflow用户

发布于 2018-05-07 07:09:02

与以往一样,当有多个解决方案可用时,这取决于您想要实现的目标。但是文献资料给出了一些选择的指令。

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

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

别忘了你已经可以选择以不同的方式提供服务了。例如,也可以在组件级别声明可注入性(在V6中不会改变)。

代码语言:javascript
复制
  @Component({
    selector: 'app-my-component',
    templateUrl: './my.component.html',
    providers: [ MyService ]
  })

这样,服务就只能在MyComponent及其子组件树中使用。

票数 14
EN

Stack Overflow用户

发布于 2018-11-01 10:20:43

如果您使用的是角5+开发人员,它将在声明为providedIn:'root‘时自动创建可注入的服务,在这种情况下,您将不需要导入app.module.ts中的服务。您可以直接在另一个组件中使用它。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50208642

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档