[英]Angular 5 global components and their services
查看 Angular 的文档,特别是样式指南,他们列出了共享模块和核心模块。 根据文档,服务应放置在核心模块中,而组件应放置在共享模块中。 我的问题是,如果我有一个组件,比如说自定义文件上传组件,并且它也有相应的服务,那么该组件和服务应该驻留在何处? 由于服务与组件一起使用,因此将两者保持在一起似乎很有意义,但是,这似乎并不遵循 Angular 标准。 有人遇到过这个问题吗?
根据 Angular Style Guide,Angular 并不真正推荐在SharedModule
提供服务。 原因是,无论哪个模块导入SharedModule
,都将获得该共享服务的单独实例。 在有状态服务的情况下,这实际上是不可接受的。 但是在您的情况下,我不确定该服务是否会包含任何状态数据。 所以我认为,将这个 Component 和这个 Service 添加到 SharedModule 本身应该是安全的。
同样,考虑到此服务不会有任何状态数据。
此外,Angular 建议在CoreModule
内提供服务,因为它还建议使CoreModule
只能由单个模块(通常是AppModule
)导入。 这就是为什么它还建议创建一个 Guard以防止重新导入 CoreModule。
查找Providers和singleton-services 。 以通常的方式:
如果您需要每个组件实例的服务实例,那么您可以在组件定义中提供该服务,并且您可以将该服务实例传递给所有子组件:
@Component({ /* . . . */ providers: [UserService] })
在您的示例中:如果每个上传组件都需要新的服务实例,则服务被定义为 @Injectable 类,导入到上传组件源并在组件装饰器提供者部分注册为提供者。
这是一个很好的问题,我公司的同事经常问我这个问题。 正如您所说,官方文档中的最佳实践是让CoreModule
和SharedModule
分别负责不同的问题。 大多数情况下,将您的服务放入“核心”并将组件/指令/管道等放入“共享”是有意义的。
但有时我们确实有例外并希望执行以下操作:
SharedModule
一项服务,用于管理对应组件/指令/管道的状态/配置/行为CoreModule
中的一个组件,它只存在于根级别或在运行时动态创建。 对于场景 1,您可以为您的模块使用传统的forRoot()
方法,以确保您的服务仅初始化一次。 另外值得一提的是,在 Angular 6 中,您可以使用新的provideIn: 'root'
语法来简化此目的。 你可以在网上找到很多资源。
对于场景 2,您通常将其放入entryComponents
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.