Angular 5全球组件及其服务

时间:2018-08-30 19:55:45

标签: javascript angular

通过Angular的文档,特别是样式指南,他们展示了共享模块和核心模块。根据文档,服务应放置在核心模块中,共享组件中应包含组件。我的问题是,如果我有一个组件,比如说一个自定义文件上传组件,并且它还具有相应的服务,那么该组件和服务应位于何处?由于将服务与组件一起使用,将两者保持在一起似乎很有意义,但是,这似乎并没有遵循Angular标准。有人遇到这个问题吗?

3 个答案:

答案 0 :(得分:1)

根据《 Angular样式指南》,Angular并不真正建议在SharedModule中提供服务。原因是,无论哪个模块导入SharedModule,都将获得该共享服务的单独实例。对于有状态服务,这实际上是不可接受的。但就您而言,我不确定该服务是否将包含任何状态数据。因此,我认为将这个组件和该服务添加到SharedModule本身应该是安全的。

同样,考虑到此服务将没有任何状态数据。

此外,Angular建议在CoreModule内部提供服务,因为它还建议使CoreModule仅可通过单个模块(通常为AppModule)导入。因此,它还建议使用creating a Guard来防止重新导入CoreModule。

答案 1 :(得分:1)

查找Providerssingleton-services。按照通常的方式:

  • 如果要使用单例服务,则必须在根模块中提供它,例如:路由器
  • 如果每个组件实例都需要服务实例,则可以在组件定义中提供该服务,然后可以将该服务实例传递给所有子组件:

    @Component({ / * 。 。 * /   提供者:[UserService] })

    在您的示例中:如果每个上载组件都需要新的服务实例,则将服务定义为@Injectable类,将其导入以上载组件源,并在组件装饰器提供程序部分中注册为提供程序。

答案 2 :(得分:0)

这是一个很好的问题,我的公司同事经常问这个问题。正如您所说,官方文档中的最佳做法是让CoreModuleSharedModule各自负责不同的问题。在大多数情况下,将服务置于“核心”,将组件/指令/管道等置于“共享”是有意义的。

但是有时候我们确实有例外,并且想要执行以下操作:

  1. SharedModule中的一项服务,用于管理对应的组件/指令/管道
  2. 状态/配置/行为
  3. CoreModule中的一个组件,仅存在于根级别或在运行时动态创建。

对于方案1,您可以为模块使用旧式forRoot()方法,以确保您的服务仅初始化一次。另外值得一提的是,在Angular 6中,您可以使用新的provideIn: 'root'语法来简化此目的。您可以在线找到许多资源。

对于场景2,通常将其放入entryComponents