Javascript 角6依赖注入
在Angular 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 {} 所以 应该使用哪种方法使注入器知道它应该注入
属性在模块中注册服务:
@Injectable({
providedIn: 'root',
})
export class HeroService {}
但是,文档还提到在模块元数据中的模块提供者数组中注册服务,就像我们在Angular 5中所做的那样:
@NgModule({
providers: [HeroService],
})
export class AppModule {}
所以
- 应该使用哪种方法使注入器知道它应该注入的服务
- 模块
提供程序数组方法是否会被弃用
与往常一样,当有多种解决方案可用时,这取决于您想要实现的目标。但是给了你一些选择的指导
有时,让服务总是在公共场所提供是不可取的
根注入器的应用。也许用户应该明确地选择加入
使用该服务,或者该服务应以
延迟加载的上下文。在这种情况下,应该关联提供程序
具有特定的@NgModule类
,并将由任何一方使用
喷油器包括该模块
因此,对于应用程序范围内的任何服务,基本上都将使用“root”中提供的。对于其他服务,请继续使用旧版本
别忘了,您已经可以选择以不同的方式提供服务。例如,还可以在组件级别声明可注入性(在V6中不会改变)
这样,该服务仅在MyComponent
及其子组件树中可用。基本上您可以使用其中任何一种,但根据新的CLIprovideIn将在创建服务时自动添加
#提供
现在有了一种新的推荐方式,可以直接注册提供者
在@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 ]
})