为什么Angular RouterModule使用forRoot()和forChild()?
我已经阅读了有关forRoot模式以及如何保护提供者单例免受多次导入(https://angular.io/guide/singleton-services#the-forroot-pattern)的文章,并且我知道为什么Routermodule使用forRoot()。
但是我的问题是,为什么同时使用[ RouterModule.forRoot() <=> RouterModule.forChild() ]
?仅使用[ RouterModule.forRoot() <=> RouterModule ]
是否还可以?
为什么有角度的开发人员强迫用户为FORCHILD()
写一些字母?只是为了清楚?
答案 0 :(得分:0)
forRoot()和forChild()之间的区别:
因此,建议在“根”模块中使用forRoot()。
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
仅具有RouterModule
(declarations
,components
,directives
),并且所有pipes
均由services
提供。那么forRoot()
将是forChild()
的完美子集。
作为图:
因此,我一直想知道是否仅forRoot()
提供forRoot
而services
和forChild()
都不提供,那么RouterModule
和{{ 1}}。
但是我错了。
与我的想法不同,forChild()
还提供了RouterModule
,forChild()
不应提供。 services
提供的forRoot()
之一是用户定义的路由,显然应该具有每个实例。
正确的diagarm看起来像这样:
我误解了,因为我从未见过应该多次提供services
,因为它的单身可能会被破坏。
forChild()
单独制造是有原因的。services
不是forChild()
的子集,显然与forChild()
本身不同。