【问题标题】:Dynamically create routes array for Angular Router为 Angular 路由器动态创建路由数组
【发布时间】:2019-03-06 18:55:15
【问题描述】:

我想为 Angular 路由器动态创建 routes 数组,以有条件地包含延迟加载的路由。

app-routing.ts

// fix declaration working perfectly fine - nothing special here
const routes: Routes = [
  {
    path: '',
    component: HomeComponent,
    children: [
      { path: 'some-url', loadChildren: './path/to/my.module#MyLazyLoadedModlue'},
      ...
    ]
  }
];

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


为了实现懒加载路由的条件使用我试过了:

const useModule = true;  // simulating condition here

children: [
  useModule ? { path: 'some-url', loadChildren: './path/to/my.module#MyLazyLoadedModlue' } : [],
  ...
]

由于这种技术非常适合有条件地包含模块,我认为它会起作用,但它导致了一个我无法解决的 TS 错误。

键入'{路径:字符串; loadChildren: () => typeof MyLazyLoadedModlue; } | undefined[]' 不是数组类型。使用编译器选项“--downlevelIteration”来允许迭代器的迭代。


接下来我尝试用函数生成路由...

function getRoutes() {
  // some logic to dynamically generate the routes array

  return routes;
}

imports: [RouterModule.forRoot(getRoutes())],
...

...导致编译错误:

无法读取未定义的属性“loadChildren”时出现错误

有谁知道如何做到这一点并解释为什么这会导致麻烦?我认为动态生成路由数组不会有问题。

【问题讨论】:

  • 如果路由是动态加载的,我不明白有条件的原因,介意解释一下吗?
  • 我使用不同的环境来支持不同的构建。在某些构建中,应该删除延迟加载路由的完整功能,因此我想根据相应环境文件中设置的条件动态包含路由。也许我走错了路,但我认为这应该是通过动态路线实现这一目标的最简单方法。
  • 我建议重新考虑这一点。应用程序构建应该与环境无关。
  • 也许另一种方法是在发布期间将这些环境文件作为 JSON 资产注入并使用它们而不是 env 文件。这确实与您的原始代码没有什么不同,而是将环境信息移动到发布定义。
  • 我想通过排除路由来实现的目标是,延迟加载的模块及其所有子模块都可以被树摇走。通过仅使用我在发布构建后使用的静态 JSON,我将始终在我的构建中拥有整个应用程序,即使某些部分永远不会被使用。

标签: javascript angular angular-router


【解决方案1】:

我看到的是你声明一个嵌套子数组处于错误状态:

children : [ [] ]

我认为你需要的,至少是这个嵌套数组的声明

[{path: ''}]

试试吧!

【讨论】:

  • 是的,我也认为这可能是个问题,并尝试了...(useModule ? { ... } : []),它应该可以工作,因为如果扩展运算符的操作数是空数组,则它什么也不做。
  • 您的解决方案还会导致“错误:路由配置无效”:无法指定数组”。还是谢谢。
猜你喜欢
  • 1970-01-01
  • 2021-12-01
  • 2023-04-11
  • 1970-01-01
  • 2022-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多