7

现在,使用 Angular v5,在使用延迟加载的同时,我加载了app.module.ts我认为可能不是最佳策略的所有提供程序,因为这不会加快我的应用程序启动时间,特别是因为我有类似 50 的自定义提供者(不要评判我;))。

因此,我问自己是否真的应该为我的所有应用程序加载所有这些,或者我是否应该只在我只使用它们的地方加载它们?

我猜最好只在我真正使用它们的地方加载提供程序。

但是在这种情况下,对我来说根本不清楚如何解决以下构造:

假设我有三个页面(A、B 和 C),它们有自己的模块和三个提供者(1,2 和 3)。

A use 1
B use 1, 2, 3
C use 1, 2
  • 我想,因为 1 在所有应用程序中都使用,所以我必须在app.module.ts

  • 由于 3 仅在页面 B 中使用,我想我只需要在B.module.ts

  • 但是2呢?我如何在两者中声明它B.module.tsC.module.ts以共享相同的提供者“内存”为目标(如果提供者包含一个值,则 B 和 C 都应该看到同一个对象),我将如何分别编码?只需“像往常一样”注入提供者,然后用角度来完成其余的工作吗?

提前谢谢任何帮助,将不胜感激

更新

不确定我是否正确理解了角度文档,但这是目标,应该为所有应用程序加载提供程序,对吗?

https://angular.io/guide/ngmodule-faq#q-component-scoped-providers

2018 年更新

注入策略随着 Angular v6 的引入而发展。根据文档,可以providedIn指定应该在哪个模块中使用服务。见https://angular.io/guide/dependency-injection

4

2 回答 2

1

您应该创建一个共享模块来强化您的提供者 2,并且 B 和 C 模块包含在它们的依赖项中。

编辑:您不需要导出提供程序。

于 2017-10-12T11:36:48.883 回答
0

答案是你应该添加你的提供者,app.module.ts因为它是一个单例服务。这是来自角度依赖注入文档

依赖项是注入器范围内的单例

这意味着当您在其中声明您的提供程序时,app.module.ts它将在整个应用程序中是单例的,并且注入它的每个模块都将共享它的相同实例。
当您在单独的模块(即B.module.ts和)中声明您的提供者时C.module.ts,您B page将使用提供者的一个实例C page并将使用另一个提供者实例。这不是提供者的目的。

于 2017-10-13T02:37:08.690 回答