Skip to content

Commit 21c2083

Browse files
authored
Merge pull request #75 from ngfelixl/feat/route-reuse-strategy
feat: cache routes
2 parents fd29b4f + 6b308e8 commit 21c2083

File tree

2 files changed

+49
-3
lines changed

2 files changed

+49
-3
lines changed

apps/web/src/app/app-routing.module.ts

+44-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,12 @@
11
import { NgModule } from '@angular/core';
2-
import { Route, RouterModule } from '@angular/router';
2+
import {
3+
ActivatedRouteSnapshot,
4+
BaseRouteReuseStrategy,
5+
DetachedRouteHandle,
6+
Route,
7+
RouteReuseStrategy,
8+
RouterModule,
9+
} from '@angular/router';
310
import { PlotsComponent } from './components/plots/plots.component';
411
import { TutorialComponent } from './components/tutorial/tutorial.component';
512

@@ -14,3 +21,39 @@ const routes: Route[] = [
1421
exports: [RouterModule],
1522
})
1623
export class AppRoutingModule {}
24+
25+
export class AppRoutesReuseStrategy implements RouteReuseStrategy {
26+
private cache: { [key: string]: DetachedRouteHandle } = {};
27+
28+
shouldDetach(route: ActivatedRouteSnapshot): boolean {
29+
return true;
30+
}
31+
32+
store(route: ActivatedRouteSnapshot, handler: DetachedRouteHandle): void {
33+
if (handler) {
34+
this.cache[this.getUrl(route)] = handler;
35+
}
36+
}
37+
38+
shouldAttach(route: ActivatedRouteSnapshot): boolean {
39+
return !!this.cache[this.getUrl(route)];
40+
}
41+
42+
shouldReuseRoute(
43+
future: ActivatedRouteSnapshot,
44+
current: ActivatedRouteSnapshot
45+
): boolean {
46+
return future.routeConfig === current.routeConfig;
47+
}
48+
49+
retrieve(route: ActivatedRouteSnapshot) {
50+
if (!route.routeConfig || route.routeConfig.loadChildren) {
51+
return null;
52+
}
53+
return this.cache[this.getUrl(route)];
54+
}
55+
56+
private getUrl(route: ActivatedRouteSnapshot): string {
57+
return route.routeConfig?.path ?? '';
58+
}
59+
}

apps/web/src/app/app.module.ts

+5-2
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import { MatButtonModule } from '@angular/material/button';
44
import { MatToolbarModule } from '@angular/material/toolbar';
55
import { BrowserModule } from '@angular/platform-browser';
66
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
7-
import { AppRoutingModule } from './app-routing.module';
7+
import { AppRoutesReuseStrategy, AppRoutingModule } from './app-routing.module';
88
import { AppComponent } from './components/app/app.component';
99
import { TutorialComponent } from './components/tutorial/tutorial.component';
1010
import { MatSidenavModule } from '@angular/material/sidenav';
@@ -15,6 +15,7 @@ import { DragDropModule } from '@angular/cdk/drag-drop';
1515
import { MatCardModule } from '@angular/material/card';
1616
import { MatIconModule } from '@angular/material/icon';
1717
import { MatTooltipModule } from '@angular/material/tooltip';
18+
import { RouteReuseStrategy } from '@angular/router';
1819

1920
@NgModule({
2021
declarations: [
@@ -37,7 +38,9 @@ import { MatTooltipModule } from '@angular/material/tooltip';
3738
MatIconModule,
3839
MatTooltipModule,
3940
],
40-
providers: [],
41+
providers: [
42+
{ provide: RouteReuseStrategy, useClass: AppRoutesReuseStrategy },
43+
],
4144
bootstrap: [AppComponent],
4245
})
4346
export class AppModule {}

0 commit comments

Comments
 (0)