Javascript 角6依赖注入

Javascript 角6依赖注入,javascript,angular,typescript,angular-cli,angular6,Javascript,Angular,Typescript,Angular Cli,Angular6,在Angular 6的最新版本中,使用服务元数据中的属性在模块中注册服务: @Injectable({ providedIn: 'root', }) export class HeroService {} 但是,文档还提到在模块元数据中的模块提供者数组中注册服务,就像我们在Angular 5中所做的那样: @NgModule({ providers: [HeroService], }) export class AppModule {} 所以 应该使用哪种方法使注入器知道它应该注入

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

@Injectable({
  providedIn: 'root',
})
export class HeroService {}
但是,文档还提到在模块元数据中的模块
提供者
数组中注册服务,就像我们在Angular 5中所做的那样:

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

  • 应该使用哪种方法使注入器知道它应该注入的服务
  • 模块
    提供程序
    数组方法是否会被弃用

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

有时,让服务总是在公共场所提供是不可取的 根注入器的应用。也许用户应该明确地选择加入 使用该服务,或者该服务应以 延迟加载的上下文。在这种情况下,应该关联提供程序 具有特定的
@NgModule类
,并将由任何一方使用 喷油器包括该模块

因此,对于应用程序范围内的任何服务,基本上都将使用“root”中提供的
。对于其他服务,请继续使用旧版本

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


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

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

#提供

现在有了一种新的推荐方式,可以直接注册提供者 在
@Injectable()
装饰器中,使用新提供的 属性它接受
'root'
作为您的应用程序的值或任何模块 应用当您使用
'root'
时,您的可注入项将被注册 作为应用程序中的单例,您不需要将其添加到 根模块的提供者。类似地,如果使用在:UsersModule中提供的
,
可注入的已注册为
UsersModule
而不将其添加到模块的提供程序中

这种新的方法已经被引入到有一个更好的树震动的环境中 应用当前添加到模块提供程序的服务 将最终成为最终的捆绑包,即使它没有在 应用程序,这有点悲哀

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

  • [正如Tuan Tu在下面的评论中所建议的]

如果您使用的是angular 5+developer,当在“root”中声明为Provided时,它将自动创建可注入服务,在这种情况下,您无需在app.module.ts中导入该服务。您可以直接在另一个组件中使用它。

装饰程序的
@NgModule()
@component()
具有提供程序元数据选项,您可以在其中为NgModule级别或组件级别的注入器配置提供程序

@Injectable()decorator具有providedIn元数据选项,在该选项中,您可以使用根注入器或特定模块的注入器指定修饰服务类的提供者

在您的情况下,因为它是在“根”级别提供的,所以无需在模块中再次将其作为提供程序添加


有关的更多信息,当我们在
@injectable
中使用
providedIn:'root
'属性时,我们不需要在提供程序的数组中输入

通过使用
中提供的
,将有利于树的抖动特性


“树摇动”功能可在生产时删除未使用的依赖项,而不使用该功能。

此处有说明,还请注意,如果您没有正确标记引号,则看起来像是剽窃。@jonrsharpe是的,我复制了大部分内容,这就是为什么发布链接的原因。实际上,我觉得很奇怪,服务知道使用它的模块,反之亦然。这样的服务如何可以重用?如果我添加了一个需要使用服务的新模块,我需要更改服务本身吗?听起来相当ridicules@DenisItskovich-单例可重用服务只需@Injectable({providedIn:'root'…-这也可用于服务对服务的依赖关系(如果不是单例,则在要重用它的每个组件的提供者数组中使用DI).因此,基本上根据JEY在这里的另一个回答,不同的选项适用于不同的用例供参考,这里有一些更新的文档链接,因为引用似乎来自博客文章,而文档链接现在不正确
  @Component({
    selector: 'app-my-component',
    templateUrl: './my.component.html',
    providers: [ MyService ]
  })