Angular 中跨分模块后路由复用问题

Angular 中跨分模块后路由复用问题

当我们的 Angular 应用越来越大后,就需要考虑使用模块或者直接使用库来将解体应用,使用时进来懒加载,加快访问速度。当跨分模块后,普通的路由复用策略就是失效,需要额外的解决方法。

前提

angular 使用路由复用 这篇文章里介绍了如何使用路由复用。

angular 划分库 这篇文章里介绍了如何使用库的方式来减小应用复杂性。

问题

使用懒加载后,应用大概率会抛出 Cannot reattach ActivatedRouteSnapshot created from a different route 这个错误,这主要是因为,使用模块后,每个模块都可能会有 '' 这个路径来做默认路由,系统无法正确找到路由快照。

解决

解决方法也比较简单,既然是因为 key 重复,那就使用不会重复的名称来作为 key 就行。我这边的解决方案,是去定义一个自定义的结构来存储数据,Route 类型中提供了属性data,就是下面代码里的 data

const routes: Routes = [
{
    path: 'login',
    component: LoginComponent,
    data: { url: '/login' },
  },
];

复用策略中也使用 data 中的 url来实现快照的存储和还原。

import { RouteReuseStrategy, , ActivatedRouteSnapshot, DetachedRouteHandle } from '@angular/router';

export class AppRouteReuseStrategy implements RouteReuseStrategy {
  public static handlers: Map<string, DetachedRouteHandle | undefined> = new Map();

  constructor() { }

  public shouldDetach(_route: ActivatedRouteSnapshot): boolean {
    return true;
  }

  public store(
    route: ActivatedRouteSnapshot,
    handle: DetachedRouteHandle
  ): void {
    if (!route.data) return;
    AppRouteReuseStrategy.handlers.set(route.data['url'], handle);
  }

  public shouldAttach(route: ActivatedRouteSnapshot): boolean {
    return !!route.routeConfig && !!AppRouteReuseStrategy.handlers.get(route.data['url']);
  }

  public retrieve(route: ActivatedRouteSnapshot): DetachedRouteHandle | null {
    if (!route.data || !AppRouteReuseStrategy.handlers.has(route.data['url'])) return null;
    return AppRouteReuseStrategy.handlers.get(route.data['url'])!;
  }

  public shouldReuseRoute(
    future: ActivatedRouteSnapshot,
    curr: ActivatedRouteSnapshot
  ): boolean {
    return future.routeConfig === curr.routeConfig;
  }
}
发布时间:2022-09-05
其他阅读

JavaScript构建一个Markdown解析器

Markdown是一种轻量级标记语言,以简单易读的语法和可生成丰富多彩的内容,受到开发者们的青睐。无论是文档编写,还是博客传记都广泛使用到Markdown。本文介绍试用JavaScript来构建一个Markdown解析器,解锁Markdown的强大之处。

查看原文

WPF中切换主题功能

在现代 Windows 系统中,系统提供了亮色主题和暗色主题,Windows 自带的应用程序都已经适配该功能。本文介绍在使用 WPF 构建 Windows 窗口应用时怎么实现主题切换。

查看原文

HTTP方法

HTTP报文中包含了方法,指的是客户端希望服务器对资源执行的动作,是一个单独的词,比如GET,POST,OPTIONS等,本文将会介绍主流的几种方法。

查看原文

C#完成一个应用内的消息中心

本文会讲解如何使用 C# 完成一个应用内部的消息中心(事件总线),事件驱动最大的好处就是可以很大程度的解耦合,松散结构。

查看原文

本地部署DeepSeek大模型服务

之前的文章介绍了怎么对接DeepSeek的API实现自己的助手,但是依旧使用的DeepSeek官方服务器,在高峰期还是会出现超长延时的情况,本文介绍另一种思路,通过在本机上部署DeepSeek大模型服务来告别卡顿崩溃。

查看原文