为什么RouterModule使用forRoot()和forChild()?

时间:2019-06-25 09:00:55

标签: angular

为什么Angular RouterModule使用forRoot()和forChild()?

我已经阅读了有关forRoot模式以及如何保护提供者单例免受多次导入(https://angular.io/guide/singleton-services#the-forroot-pattern)的文章,并且我知道为什么Routermodule使用forRoot()。

但是我的问题是,为什么同时使用[ RouterModule.forRoot() <=> RouterModule.forChild() ]?仅使用[ RouterModule.forRoot() <=> RouterModule ]是否还可以?

为什么有角度的开发人员强迫用户为FORCHILD()写一些字母?只是为了清楚?

3 个答案:

答案 0 :(得分:0)

forRoot()和forChild()之间的区别:

  • forRoot()包括路由器服务本身
  • forChild()本身不包括路由器服务

因此,建议在“根”模块中使用forRoot()。

forChild()在您的其他模块中用于优化性能,并且一无所获。

https://angular.io/api/router/RouterModule#forChild

答案 1 :(得分:0)

RouterModule定义提供程序和声明。

  

如果模块定义了提供者和声明(组件,指令,管道),那么将模块加载到多个功能模块中将重复服务的注册。这可能会导致多个服务实例,并且该服务将不再表现为单例。

来源:https://angular.io/guide/singleton-services

forRoot和forChild告诉模块要导入的部分,因此您不会获得多个服务实例。如果没有中央服务(单例),则在访问服务时会遇到各种意外行为。

forChild阻止导入服务,否则将破坏单例。

答案 2 :(得分:0)

TR; DL:我误解了<div class="box"> <ul> <li class="border"> <a href="/'>click</a> </li> </ul> </div>RouterModule提供了forChild()不应提供的services。因此forRoot()不能替换为forChild()

误解

阅读RouterModule的源代码后,我意识到自己被误解了。

我的想法:

RouterModule仅具有RouterModuledeclarationscomponentsdirectives),并且所有pipes均由services提供。那么forRoot()将是forChild()的完美子集。

作为图:

因此,我一直想知道是否仅forRoot()提供forRootservicesforChild()都不提供,那么RouterModule和{{ 1}}。

但是我错了。

更正

与我的想法不同,forChild()还提供了RouterModuleforChild()不应提供。 services提供的forRoot()之一是用户定义的路由,显然应该具有每个实例。

正确的diagarm看起来像这样:

我误解了,因为我从未见过应该多次提供services,因为它的单身可能会被破坏。

结论

forChild()单独制造是有原因的。services不是forChild()的子集,显然与forChild()本身不同。