0

我的应用程序有点大。它包含许多功能模块,并且大多数都是延迟加载的。我想预加载一个延迟加载的模块,该模块包含在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 。但这并没有发生。

4

1 回答 1

1

我花了将近 2 个小时来了解为什么即使我做的一切都正确,该模块也没有预加载。

问题在于children,任何定义并进一步分发children的路由都被视为正常路由,即使您已经childrenloadChildren. preloadingStrategy只需要预加载模块而不是路径/路由。当您在 children 下定义路线时,它会将其视为正常路线并继续扫描提供的其他路线loadChildren。以下是 Angular 与您的路线的解释:

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', data: { preload: true }}    // Module found, preload it! 
];

如果您在自定义中仔细调试,CustomPreloadingWithDelayStrategy那么您会发现您的路由/page3/sub-page1/data1/data2甚至无法弥补方法的route参数,preload()因为预加载完全是关于加载模块而不是加载路由。但是,我们的路线abc确实出现了!希望能帮助到你 :)

于 2020-02-24T15:22:05.343 回答