在功能模块中导入 HttpClientModule

Ale*_*mov 2 angular-module angular angular-httpclient

文档HttpClientModule说:

在您可以使用 HttpClientModule 之前,您需要导入 Angular HttpClientModule。大多数应用程序都在根 AppModule 中执行此操作。

  1. 在哪些情况下我们要导入HttpClientModule到功能模块中?
  2. 如果我们将它导入到多个功能模块中,而这些功能模块又被导入到根模块中,会发生什么?
  3. 当我们在一个应用程序中有几十个模块,其中一些需要HttpClientModule,而我们HttpClientModule只想导入这几个模块时,这是一个正确的用例吗?

Aks*_*ana 5

因此,有两种方法可以在根模块中加载模块,

  1. 将其添加到导入数组中
  2. 延迟加载

现在,当您在导入数组中加载模块时,该模块提供的所有服务都将成为单例服务,也就是说,只有这些服务的单个实例将在整个应用程序中共享。这些服务的实例是在应用程序引导时由根注入器创建的。

在服务方面,无论是在根模块中加载一个模块还是在多个功能模块中加载,然后将所有这些功能模块加载到根模块中,最终都会得到服务的单个实例。

但是,就您的声明而言,即组件、管道、指令。如果要将 AModule 用于其导出的组件,则必须在要使用这些组件的功能模块中加载 AModule。

但是,您可以查看 HttpClientModule source_code。声明或导出数组中没有任何内容。它只提供服务,所以不管你是在你的功能模块中加载它(同时在根模块的导入数组中加载功能模块),还是在根模块中,你都会以任何一种方式获得它的服务。因此,只需将其加载到根模块中即可。

现在,当您使用延迟加载来加载功能模块时,延迟加载的模块确实获得了根模块中所有其他模块提供的所有服务,但它有自己的注入器,这意味着如果您在延迟加载的模块中加载 HttpClientModule已加载到根模块中,您最终将获得 HttpClientModule 提供的所有服务的两个实例,而您不希望那样。

您可以进一步阅读有关 forRoot 和 forChild 模式的更多信息来解决此类情况。

  • 很好的答案!只是一个小错误:“这些服务是在应用程序引导时由根注入器创建的” - 这些服务是在第一次出现时创建的。这*可以*是引导程序的时间,但也*可能*是在稍后的时间(例如,当延迟加载的页面首先请求服务并且之前没有使用过该服务时)。 (2认同)