当前位置: 首页 > Web前端 > HTML

AngularRouterModule.forRoot(ROUTES)和forChild(ROUTES)的区别

时间:2023-04-02 19:08:36 HTML

许多Angular初学者在学习Angular路由框架时,都会对forRoot和forChild这两个方法的区别感到困惑。Angular的官方网站解释了这两种方法:forRoot创建一个包含所有指令、给定路由和路由器服务本身的模块。forChild创建一个包含所有指令和给定路由的模块,但不包含路由器服务。但缺乏具体的例子。带有提供者的模块当我们导入一个模块时,我们通常使用对模块类的引用。示例:@NgModule({providers:[AService]})导出类A{}-----------------------------------@NgModule({imports:[A]})exportclassB这样,所有在模块A上注册的ServiceProvider都会被添加到根注入器中,供整个应用使用。另一种方法也适用:@NgModule({providers:[AService]})classA{}exportconstmoduleWithProviders={ngModule:A,providers:[AService]};-----------------------@NgModule({imports:[moduleWithProviders]})exportclassB我们知道懒加载模块有自己的注入器。因此,假设我们要注册AServices以在整个应用程序中使用,但某些BServices仅可用于延迟加载的模块。模块可以像这样重构:@NgModule({providers:[AService]})classA{}exportconstmoduleWithProvidersForRoot={ngModule:A,providers:[AService]};exportconstmoduleWithProvidersForChild={ngModule:A,providers:[BService]};------------------------------------------@NgModule({imports:[moduleWithProvidersForRoot]})exportclassB//延迟加载模块@NgModule({imports:[moduleWithProvidersForChild]})exportclassC这样,服务B将仅对子延迟加载模块可用,而服务A将对整个应用程序可用。上述代码可以进一步重构为:@NgModule({providers:[AService]})classA{forRoot(){return{ngModule:A,providers:[AService]}}forChild(){return{ngModule:A,供应商:[B服务]}}}-----------------------------------------@NgModule({imports:[A.forRoot()]})exportclassB//懒加载模块@NgModule({imports:[A.forChild()]})exportclassC当我们拿到Service的引用实例时通过相同的注入令牌,这就是事情变得更有趣的地方。exportconstmoduleWithProvidersForRoot={ngModule:A,providers:[{provide:token,useClass:AService}]};exportconstmoduleWithProvidersForChild={ngModule:A,providers:[{provide:token,useClass:BService}]};当从延迟加载的模块使用单独的配置请求令牌时,我们将获得服务B的实例引用。RouterModule使用ROUTES令牌获取特定于模块的所有路由。因为它希望特定于延迟加载模块的路由在该模块内可用(类似于我们之前讨论的服务B),所以它对延迟加载子模块使用不同的配置:staticforChild(routes:Routes):ModuleWithProviders{return{ngModule:RouterModule,提供者:[{provide:ROUTES,multi:true,useValue:routes}]};}