如何在角度中使用 useFactory 根据某些条件延迟加载模块?

2024-01-05

我有一个包含大量模块和组件的角度项目,其中我想根据某些业务逻辑显示模块的组件。 我想使用 Angular 的强大功能,即延迟加载,这将使我的应用程序变得精简。

我想做的事 :

假设我有一个书店网站,很多读者都花时间阅读在线文章。 我想根据以下内容显示不同的模块reader's role。如果读者的角色是管理员或员工,那么他们可以访问所有功能和组件。如果读者的角色是normal那么他们只能查看某些组件。

为此,我做了这样的结构:

为了实现这个功能。我们必须保持模块的路线相同,为此,我必须使用 Angular 的 useFactory 方法,它允许我运行自定义函数进行更新InjectionToken(ROUTES)Angular 本身已经使用它来编译和加载模块。

我的模块流程是这样的:

所有三个模块(读者处理程序、管理/读者和用户/读者)都是延迟加载模块。 reader-handler 模块的路径在路由文件中定义,但其他两个模块的路径将使用 useFactory 函数动态附加到 ROUTES 中。

这是我的代码:

providers: [{
    provide: ROUTES,
    useFactory: decideWhichModuleToLoad,
    deps: [ReaderService],
    multi: true,
  }]

export function decideWhichModuleToLoad(readerService: ReaderService) {
   readerService.getReaderType().subscribe((result) => {
    let routes: Routes = [];
    if (result && result?.Role) {

      if (result.Role == 'admin') {
        routes = [{
          path: '',
          loadChildren: () =>
            import('../admin/read.module').then((m) => m.ReadModule)
        }]
      }
      else {
        routes = [{
          path: '',
          loadChildren: () => import('../user/read.module').then((m) => m.ReadModule)
        }]
      }
    }
    else {
      routes = [{
          path: '',
          loadChildren: () => import('../user/read.module').then((m) => m.ReadModule)
        }]
    }
    return routes;
  });
}

我把这段代码写在read-handler模块所以。当这个模块加载时,它是useFactory将执行并更新ROUTES已被 Angular 使用的变量。

如果我直接返回路由而不等待服务的条件和订阅响应,它就会工作并加载模块。 如果我运行上面的代码,那么动态加载的我的子组件和模块将是未定义的。因为 Angular 已经编译了ROUTES在我们更新它之前。 错误看起来像这样:

我正在关注这个动态路由教程:如何在同一条路径上加载不同的模块 https://medium.com/@german.quinteros/angular-use-the-same-route-path-for-different-modules-or-components-11db75cac455Angular 说这是 Angular 的 bug,在 useFactory 解析之前,Angular 编译ROUTES注入令牌。 (无法读取未定义的属性“loadChildren””错误 https://github.com/angular/angular/issues/22700)

任何人都知道我该如何解决这个错误......并保持角度等待解决usefactory。 任何小的建议都会对我有帮助。


您在订阅内设置路由,并且它是异步的。您可以尝试拨打电话getReaderType进入之前decideWhichModuleToLoad函数并将其存储在某个地方,以便您可以直接从您的useFactory.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在角度中使用 useFactory 根据某些条件延迟加载模块? 的相关文章

随机推荐