我有一个包含大量模块和组件的角度项目,其中我想根据某些业务逻辑显示模块的组件。
我想使用 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
。
任何小的建议都会对我有帮助。