TLDR
StackBlitz app.
说明
对于这种情况,我们可以使用自定义RouteReuseStrategy:
app.module.ts
export class CustomRouteReuseStrategy extends BaseRouteReuseStrategy {
shouldReuseRoute(
future: ActivatedRouteSnapshot,
curr: ActivatedRouteSnapshot
): boolean {
const determinantParam = "proyectoId";
if (
!curr?.routeConfig?.path.includes(determinantParam) ||
!future?.routeConfig?.path.includes(determinantParam)
) {
return super.shouldReuseRoute(future, curr);
}
return future.params[determinantParam] === curr.params[determinantParam];
}
}
BaseRouteReuseStrategy 定义为 here 和 here 是为什么在使用新的 param 时它没有创建新组件的原因:
shouldReuseRoute(future: ActivatedRouteSnapshot, curr: ActivatedRouteSnapshot): boolean {
return future.routeConfig === curr.routeConfig;
}
它返回true,因为来自两个对象(future 和curr)的routeConfig 的值是planificador.module.ts 中Routes 数组中定义的第一项强>:
{
path: '',
component: PlanificadorAppComponent,
children: [
{
path: ':empleadoId/proyectos',
component: MainContentComponent,
},
{
path: ':empleadoId/proyectos/:proyectoId',
component: MainContentComponent,
}
]
},
正如预期的那样,Angular 通过遍历路由配置并比较之前的状态来构建下一个导航。这个状态被定义为一棵树,其中每个注释都包含有意义的信息。在这些信息中,有params对象,它的键是参数(例如:proyectoId),值是由URL的样子决定的。
那么,我们的自定义策略是如何确保如果导航涉及路径为:empleadoId/proyectos/:proyectoId 的路由,则只有在此条件为真时才应重用此路由(及其组件):
future.params[determinantParam] === curr.params[determinantParam]
此外,如果您想了解有关 Angular 路由器的更多信息,可以查看以下文章: