通过Angular的文档,特别是样式指南,他们展示了共享模块和核心模块。根据文档,服务应放置在核心模块中,共享组件中应包含组件。我的问题是,如果我有一个组件,比如说一个自定义文件上传组件,并且它还具有相应的服务,那么该组件和服务应位于何处?由于将服务与组件一起使用,将两者保持在一起似乎很有意义,但是,这似乎并没有遵循Angular标准。有人遇到这个问题吗?
答案 0 :(得分:1)
根据《 Angular样式指南》,Angular并不真正建议在SharedModule
中提供服务。原因是,无论哪个模块导入SharedModule
,都将获得该共享服务的单独实例。对于有状态服务,这实际上是不可接受的。但就您而言,我不确定该服务是否将包含任何状态数据。因此,我认为将这个组件和该服务添加到SharedModule本身应该是安全的。
同样,考虑到此服务将没有任何状态数据。
此外,Angular建议在CoreModule
内部提供服务,因为它还建议使CoreModule
仅可通过单个模块(通常为AppModule
)导入。因此,它还建议使用creating a Guard来防止重新导入CoreModule。
答案 1 :(得分:1)
查找Providers和singleton-services。按照通常的方式:
如果每个组件实例都需要服务实例,则可以在组件定义中提供该服务,然后可以将该服务实例传递给所有子组件:
@Component({ / * 。 。 * / 提供者:[UserService] })
在您的示例中:如果每个上载组件都需要新的服务实例,则将服务定义为@Injectable类,将其导入以上载组件源,并在组件装饰器提供程序部分中注册为提供程序。
答案 2 :(得分:0)
这是一个很好的问题,我的公司同事经常问这个问题。正如您所说,官方文档中的最佳做法是让CoreModule
和SharedModule
各自负责不同的问题。在大多数情况下,将服务置于“核心”,将组件/指令/管道等置于“共享”是有意义的。
但是有时候我们确实有例外,并且想要执行以下操作:
SharedModule
中的一项服务,用于管理对应的组件/指令/管道 CoreModule
中的一个组件,仅存在于根级别或在运行时动态创建。对于方案1,您可以为模块使用旧式forRoot()
方法,以确保您的服务仅初始化一次。另外值得一提的是,在Angular 6中,您可以使用新的provideIn: 'root'
语法来简化此目的。您可以在线找到许多资源。
对于场景2,通常将其放入entryComponents
。