为什么我应该在子模块中包括CommonModule?

时间:2018-10-26 19:17:40

标签: angular

如果主模块AppModule中已包含此模块,为什么我应该在子模块中包含CommonModule?

AppModule(Root) -> includes -> CommonModule
CustomModule -> incudes -> CommonModule
AppModule -> incudes -> CustomModule>

我认为CommonModuleCustomModule中是多余的,因为它是在CommonModule中全局声明的?是吗?

1 个答案:

答案 0 :(得分:2)

这是因为,如果要在CommonModule中使用CustomModule的任何导出功能(组件,指令,管道),则必须添加CommonModule才能做到这一点到imports的{​​{1}}数组中。

如果您将CustomModule导入了CommonModule,您将只能使用已注册的AppModule的导出成员(添加到CommonModule的{​​{1}})组件,指令,管道等。如果您从declarations中导出AppModule,因为CommonModule是您的根模块,并且您不会将其添加到任何其他模块的AppModule数组中,则不会除非在此导入,也可以在其他任何地方使用AppModule的导出成员。

您可以在CustomModule(如果为imports中使用CommonModule中的服务(尽管不建议这样做),因为它们已在根注入器上注册。但是除此之外,除非将其导入,否则将无法使用。

为什么不建议通过CommonModule(或providedIn: 'root'来提供服务)提供服务?

来自Angular Style Guide

  

请考虑不在共享模块中提供服务。服务通常是单例,为整个应用程序或特定功能模块提供一次。但是也有例外。例如,在下面的示例代码中,请注意,SharedModule提供了FilterTextService。这在这里是可以接受的,因为该服务是无状态的;也就是说,该服务的使用者不会受到新实例的影响。