forChild路由的预加载策略问题

问题描述 投票:0回答:1

我的应用程序大小很大。它包含许多功能模块,并且大多数都是延迟加载的。我想preload延迟加载的模块,该模块包含在forChild路由中。

为此,我参考了Angular文档并遵循了他们的步骤。我提供了下面提到的自定义预加载策略服务。

这是我的自定义预加载策略文件:

@Injectable()
export class CustomPreloadingWithDelayStrategy implements PreloadingStrategy {
  preload(route: Route, load: () => Observable<any>): Observable<any> {
    if (route.data && route.data['preload']) {
      return load();
    } else {
      return Observable.of(null);
    }
  }
} 

应用程序路由文件,

const routes: Routes =
  [
    XXX,
{
      path: '',
      data: {
        base: true
      },
      component: MyComp,
      children: [
        {
          path: 'page1/:id',
          loadChildren: 'XXXXXXX'
        },
        {
          path: 'page2',
          loadChildren: 'XXXXXXXX'
        },        
        {
          path: 'page3',
          loadChildren: 'app/feature-modules/folder1/my-folder1-module#Folder1Module'
        }];

@NgModule({
  imports: [RouterModule.forRoot(routes, {useHash: true,  preloadingStrategy: CustomPreloadingWithDelayStrategy})],
  exports: [RouterModule],
  entryComponents: [  ]
})
export class AppRoutingModule {}

我的Folder1Module的路由文件:

const routes: Routes = [{
  path: 'sub-page1/:data1/:data2',
  loadChildren: 'app/feature-modules/sub-pages/pages/sub-page1.module#SubPage1Module'
}, {
  path: 'sub-page2/:data1',
  loadChildren: 'app/feature-modules/sub-pages/pages/sub-page2.module#SubPage2Module',
  data: {preload: true}
}];


@NgModule({
  imports: [RouterModule.forChild(routes)],
  exports: [RouterModule]
})
export class Folder1RoutingModule {
}

因此,当我打开此路由/ page3 / sub-page1 / data1 / data2时,将预加载SubPage2Module。但这没有发生。

angular7 angular7-router
1个回答
0
投票

我花了将近2个小时来了解为什么即使我做对了所有事情,模块仍未预装。

问题出在children上,即使在children的帮助下定义了模块,即使children定义并进一步分配的任何路由也被视为正常路由。 loadChildren只需要预加载模块,而不需要路径/路由。在子级下定义路径后,它将视为正常路径,然后继续扫描preloadingStrategy提供的其他路径。以下是您对Angular的解释:

loadChildren

如果通过实现自定义const routes: Routes = [ XXX, // Normal path { path: '', data: { base: true }, component: MyComp, children: [ // Normal path (no module) as children is used, move on { path: 'page1/:id', loadChildren: 'XXXXXXX' }, { path: 'page2', loadChildren: 'XXXXXXXX' }, { path: 'page3', loadChildren: 'app/feature-modules/folder1/my-folder1-module#Folder1Module' }, ], }, { path: 'abc', loadChildren: '../path/to/module#AbcModule' } // Module found, preload it! ]; 进行仔细调试,则会发现路由/ page3 / sub-page1 / data1 / data2甚至无法弥补PreloadingStrategyroute参数方法,因为预加载只与加载模块有关,而不与路由有关。但是,我们的路线abc确实出现了!希望对您有所帮助:)

© www.soinside.com 2019 - 2024. All rights reserved.