2017-10-12 120 views
2

现在,虽然使用延迟加载,我加载了所有提供者在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应该看到相同的对象),分别如何编码?简单地通过注射提供者“照常”和角度做其余的?

THX提前任何帮助,将真正理解

UPDATE

不知道如果我理解正确的角度文档但是这是目标,供应商应加载了所有的应用程序都很宽?

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

回答

1

应创建一个intenciate您的供应商2共享模块,并在它们的依赖B和C模块inculdes。

编辑:你不需要导出提供者。

+1

有趣的是,这将是一个没有任何声明的共享模块吗?就像@NgModule({providers:[2],exports:[2]}) –

+1

它可以工作,它是与我需要在多个其他模块中的模块。 – Flow

+0

会尝试,会让你知道,thx –

0

答案是你应该添加你的提供商在app.module.ts,因为它是一个单身服务。下面是从angular dependency injection doc

依赖是注射器的范围内单身

这意味着当你在app.module.ts声明你的供应商将是单身在整个应用程序和每一个模块注入将共享它的同一个实例。
当你在独立的模块中声明你的提供者时,e B.module.tsC.module.ts,您的B page将使用提供者的一个实例,C page将使用另一个提供者的实例。这不是提供者的目的。

+1

是的,我认为你是对的,在结束这个问题之前,可以在本地做更多的测试。 Thx –

+0

@PeterParker:你测试了吗? – Duannx

+0

对不起,我在时间之后,没有,很可能没有时间来测试这个星期。关于“这不是提供者的目的”我不会说是和否。是的,如果你想单身人士,你必须在app.module中声明它们,但是角度似乎也表明限制组件范围来声明模块中的提供程序是可以的,请参阅https://angular.io/导向/ ngmodule-FAQ#应-I-附加其他的提供到一个模块或 - 一个组分 –