最近在弄单页面组件刷新功能的时候,接触到路由复用策略,总结下:
用法:

  • 新建路由复用文件 SimpleReuseStrategy.ts:
import { RouteReuseStrategy, DefaultUrlSerializer, ActivatedRouteSnapshot, DetachedRouteHandle } from '@angular/router';
// import { compact } from 'rxjs';
import { ComponentRef } from '@angular/core';export class SimpleReuseStrategy implements RouteReuseStrategy {public static handlers: { [key: string]: DetachedRouteHandle } = {};private static getRouteUrl(route: ActivatedRouteSnapshot) {return route['_routerState'].url.replace(/[\/, -]/g, '_');}/** 表示对所有路由允许复用 如果你有路由不想利用可以在这加一些业务逻辑判断 */public shouldDetach(route: ActivatedRouteSnapshot): boolean {return !(!route.routeConfig || route.routeConfig.loadChildren);}/** 当路由离开时会触发。按path作为key存储路由快照&组件当前实例对象 */public store(route: ActivatedRouteSnapshot, handle: DetachedRouteHandle): void {SimpleReuseStrategy.handlers[SimpleReuseStrategy.getRouteUrl(route)] = handle;}/** 若 path 在缓存中有的都认为允许还原路由 */public shouldAttach(route: ActivatedRouteSnapshot): boolean {return !!route.routeConfig && !!SimpleReuseStrategy.handlers[SimpleReuseStrategy.getRouteUrl(route)];}/** 从缓存中获取快照,若无则返回nul */public retrieve(route: ActivatedRouteSnapshot): DetachedRouteHandle {if (!route.routeConfig || route.routeConfig.loadChildren) {return null;}// console.log(SimpleReuseStrategy.handlers);return SimpleReuseStrategy.handlers[SimpleReuseStrategy.getRouteUrl(route)];}/** 进入路由触发,判断是否同一路由 */public shouldReuseRoute(future: ActivatedRouteSnapshot, curr: ActivatedRouteSnapshot): boolean {return future.routeConfig === curr.routeConfig;}/** 清除缓存 */public clearCacheHandle(){for (const key in SimpleReuseStrategy.handlers) {if (SimpleReuseStrategy.handlers[key]){this.deactivateOutlet(SimpleReuseStrategy.handlers[key])}}}/** 处理同一组件不同链接的问题 */private deactivateOutlet(handle: DetachedRouteHandle): void {const componentRef: ComponentRef<any> = handle ? handle['componentRef'] : null;if (componentRef) {componentRef.destroy();}}public clearCacheByUrl(url: string){const handleUrl = url.replace(/[\/, -]/g, '_');for (const key in SimpleReuseStrategy.handlers) {if (key === handleUrl){delete SimpleReuseStrategy.handlers[key];}}}}
  • 在AppModule中引入该文件:
@NgModule({declarations: [AppComponent],imports: [BrowserModule,BrowserAnimationsModule,HttpClientModule,DelonModule.forRoot(),CoreModule,SharedModule,LayoutModule,RoutesModule,...I18NSERVICE_MODULES,...GLOBAL_THIRD_MODULES,...FORM_MODULES,// ...MOCKMODULE,// TreeviewModule.forRoot(),],providers: [...LANG_PROVIDES, ...INTERCEPTOR_PROVIDES, ...I18NSERVICE_PROVIDES, ...APPINIT_PROVIDES, ApiService, LogService,// { provide: RouteReuseStrategy, useClass: ReuseTabStrategy, deps: [ ReuseTabService] },{ provide: RouteReuseStrategy, useClass: SimpleReuseStrategy },],bootstrap: [AppComponent],
})
export class AppModule {}

现在复用策略已经生效,这里主要说下配置过程中遇到的问题:
1、Cannot reattach ActivatedRouteSnapshot created from a different route
解决办法:
替换shouldDetach和retrieve方法如下(必须同时替换):

/** 表示对所有路由允许复用 如果你有路由不想利用可以在这加一些业务逻辑判断 */public shouldDetach(route: ActivatedRouteSnapshot): boolean {if (!route.routeConfig || route.routeConfig.loadChildren) {return false;}return true;}
/** 从缓存中获取快照,若无则返回nul */public retrieve(route: ActivatedRouteSnapshot): DetachedRouteHandle {if (!route.routeConfig) {return null;}if(route.routeConfig.loadChildren) return null;return SimpleReuseStrategy.handlers[SimpleReuseStrategy.getRouteUrl(route)];}

2、路由复用策略中的store方法,必须是一下两种方式引起的路由跳转才会触发:
(1):
(2):由router类发起的路由跳转,如:router.navigate()或router.navigateByUrl等
如果是直接指令方式发起的则不会触发store方法,如:<app-dashboard *ngIf=“show”>

angular 路由复用策略相关推荐

  1. Angular路由复用策略出现Cannot reattach ActivatedRouteSnapshot created from a different route错误

    复用代码 自己写的angular路由复用,用着基本挺好. 定义的的顺序就是复用的逻辑,离开某路由页面时,shouldDetach觉得可复用后,store去保存路由,再次进入页面时,shouldAtta ...

  2. Angular6路由复用策略解读

    本文除了介绍路由复用策略外,还实现了父子路由如何复用的问题,项目见末尾: 1.父路由和子路由页面的tab不应该同时存在,否则,切换时容易报以下错误: Cannot reattach Activated ...

  3. NG RouteReuseStrategy(路由复用策略)

    路由: 路由在执行过程中对组件无状态操作,即路由离退时组件状态也一并被删除: 路由的本质: Angular路由与组件一开始就透过 RouterModule.forRoot 形成一种关系,当路由命中时利 ...

  4. Ant Design Blazor 组件库的路由复用多标签页介绍

    前言 Blazor 是 .NET 最新的前端框架,可以基于 WebAssembly 或 SignalR (WebSocket)构建前端应用程序,基于 WebAssembly 托管模型的 Blazor ...

  5. Angular 路由

    Angular 路由 简单路由配置 每个带路由的 Angular 应用都有一个Router(路由器)服务的单例对象. 当浏览器的 URL 变化时,路由器会查找对应的 Route(路由),并据此决定该显 ...

  6. 计算机网络最佳路由,优化计算机网络路由的策略

    优化计算机网络路由的策略 计算机网络技术的广泛应用为网络路由的发展带来新的机遇与挑战,对提高网络资源的应用效率具有重要意 (本文共2页) 阅读全文>> 随着移动互联网技术和多媒体应用的快速 ...

  7. Angular 路由守卫

    1. 路由 Angular路由: 可以控制页面跳转:可以在多视图间切换: 2. 路由守卫 Angular路由守卫: 在进入或离开某路由时,用于判断是否可以离开.进入某路由::: return true ...

  8. NetScreen下“区域”与“路由”、“策略”基本概念

    NetScreen下"区域"与"路由"."策略"基本概念 "区域"这个概念是NetScreen自己定的,它是很多NetS ...

  9. angular 路由快照和 aggrid 结合后,导致aggrid 表头消失的问题

    一,路由快照简述 1. angular的路由快照,简单的说,就是记录路由访问状态.比如当访问过A路由加载过A组件之后,再次访问A路由,A组件不会重新加载 (即不会重新渲染页面,不会重新请求接口).   ...

最新文章

  1. ps-axure学习之感受
  2. cxgrid动态创建列
  3. php psr-2,「PSR 规范」PSR-2 编码风格规范
  4. 黑马程序员_集合学习1
  5. C语言中使用静态函数的好处
  6. 网宿科技:向云服务商转型
  7. 大数据实战之环境搭建(十)
  8. [转载] 七龙珠第一部——第072话 恶魔的厕所
  9. 签约!睿铂与泰瑞数创共同助力实景三维中国建设
  10. H3C 路由过滤与路由引入
  11. 2021年N1叉车司机免费试题及N1叉车司机模拟试题
  12. Shell脚本之shift用法
  13. html蒙版源代码,jquery蒙版控件实现代码_jquery
  14. 修身、齐家、治国、平天下
  15. 30天自制操作系统:第五天 结构体、文字显示与 GDT/IDT初始化
  16. Web前端:什么是前端框架?
  17. sublime 使用浏览器不反应
  18. 2019届华为实习生招聘
  19. 2021年新版电影小程序商业版+前端无后门+搭建教程亲测可用
  20. ROS入门21讲---ROS命令行工具的使用

热门文章

  1. 构建信用风险综合评价体系——基于主成分与因子分析
  2. vim cscope java_【转】Cscope的使用(领略Vim + Cscope的强大魅力)
  3. 整理1994-2019年各省统计指标面板数据(汇总成1张EXCEL)
  4. 【无标题】C语言for循环输出字符数组
  5. 架构设计之如何写架构设计说明书
  6. 有限元分析中复合材料建模
  7. 安装linux系统的ppt课件,《Linux系统的使用》PPT课件
  8. Ajax方式实现文件的下载
  9. java web 图灵_java架构师学习路线-Web架构的理解
  10. 了解python语言的开发者_Python开发者