Angular路由复用实例

本文探讨了在Angular中利用RouteReuseStrategy实现路由复用,解决动态加载Component时无法使用路由跳转及元素ID冲突的问题。参考了ng-alain库中的delon组件,尽管Angular官方标记为实验性功能,但通过重写特定方法,如在route-reuse-strategy.ts和reuse-tab-service.ts中的实现,可以在AppModule中启用路由复用策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

关于在tabset中动态加载Component ,点击查看我之前的文章
介绍了如何使用动态加载Component 的方式实现tabset 标签页,从而达到页面切换。
这种方式缺点就是无法使用Angular 的路由来跳转,多个页面如果如果某个元素的id 值相同会有影响。
以下的方式主要使用了Angular 的路由复用功能—>RouteReuseStrategy

动态加载

主要借鉴了 ng-alian里面的delon
https://github.com/ng-alain/delon
Angular在官网上显示是一个实验性的功能

官网描述
解释
解释
具体来说就是重写上述的5个方法
主要代码
route-reuse-strategy.ts

export class CustomeRouteReuseStrategy implements RouteReuseStrategy {
   

    constructor(private reuseTabService: ReuseTabService) {
    }

    /** 表示对所有路由允许复用 如果你有路由不想利用可以在这加一些业务逻辑判断 */
    public shouldDetach(route: ActivatedRouteSnapshot): boolean {
   
        return this.reuseTabService.shouldDetach(route);
    }
    /** 当路由离开时会触发。按path作为key存储路由快照&组件当前实例对象 */
    public store(route: ActivatedRouteSnapshot, handle: DetachedRouteHandle): void {
   
        return this.reuseTabService.store(route, handle);
    }
    /** 若 path 在缓存中有的都认为允许还原路由 */
    public shouldAttach(route: ActivatedRouteSnapshot): boolean {
   
        return this.reuseTabService.shouldAttach(route);
    }
    /** 从缓存中获取快照,若无则返回null */
    public retrieve(route: ActivatedRouteSnapshot): DetachedRouteHandle {
   
        return this.reuseTabService.retrieve(route);
    }
    /** 进入路由触发,判断是否同一路由 */
    public shouldReuseRoute(future: ActivatedRouteSnapshot, curr: ActivatedRouteSnapshot): boolean {
   
        return this.reuseTabService.shouldReuseRoute(future,curr);
    }
}

reuse-tab-service.ts

import {
    Injectable, OnDestroy, Injector } from '@angular/core';
import {
    ActivatedRouteSnapshot, ActivatedRoute } from '@angular/router';
import {
    ReuseTabCached, ReuseTabNotify } from '../models/reuse-tab';
import {
    BehaviorSubject, Observable } from 'rxjs';
import {
    filter } from 'rxjs/operators';

@Injectable()
export class ReuseTabService implements OnDestroy {
   
    private _cachedChange: BehaviorSubject<ReuseTabNotify> = new BehaviorSubject<ReuseTabNotify>(null);
    /**缓存路由列表 */
    private _reuseTabCachedList: ReuseTabCached[] = [];
    private _titleCached: {
    [url: string]: string } = {
   };
    private removeUrlBuffer: string;
    /** 当前路由地址 */
    get curUrl() {
   
        return this.getUrl(this.injector.get(ActivatedRoute).snapshot);
    }
    /** 获取已
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值