Thanks to the example provided by @Günter Zöchbauer, for my own understanding I decided to distill a minimal example.
See it in action
In Summary:
First I implemented a RouteReuseStrategy:
export class CustomReuseStrategy implements RouteReuseStrategy {
handlers: {[key: string]: DetachedRouteHandle} = {};
calcKey(route: ActivatedRouteSnapshot) {
let next = route;
let url = '';
while(next) {
if (next.url) {
url = next.url.join('/');
}
next = next.firstChild;
}
return url;
}
shouldDetach(route: ActivatedRouteSnapshot): boolean {
return true;
}
store(route: ActivatedRouteSnapshot, handle: DetachedRouteHandle): void {
this.handlers[this.calcKey(route)] = handle;
}
shouldAttach(route: ActivatedRouteSnapshot): boolean {
return !!route.routeConfig && !!this.handlers[this.calcKey(route)];
}
retrieve(route: ActivatedRouteSnapshot): DetachedRouteHandle {
if (!route.routeConfig) { return null; }
return this.handlers[this.calcKey(route)];
}
shouldReuseRoute(future: ActivatedRouteSnapshot, curr: ActivatedRouteSnapshot): boolean {
return this.calcKey(curr) === this.calcKey(future);
}
}
Within my AppModule
, I added a new provider and configured some routes:
export const ROUTES: Routes = [
{
path: 'one',
component: OneComponent
},
{
path: 'two',
component: TwoComponent
},
];
@NgModule({
...
imports: [... RouterModule.forRoot(ROUTES)...]
providers: [...{ provide: RouteReuseStrategy, useClass: CustomReuseStrategy }...],
...
})
export class AppModule { }
Finally, I defined some components as follows:
@Component({
selector: 'my-app',
template: `
<a [routerLink]="['/one']" >Route One</a><br>
<a [routerLink]="['/two']" >Route Two</a><br>
<router-outlet></router-outlet>
`
})
export class AppComponent {}
@Component({
selector: 'app-one',
template: `
Route One currently showing<br>
<input type="text" placeholder="enter some text">
`,
})
export class OneComponent {}
@Component({
selector: 'app-two',
template: `
Route Two currently showing<br>
<input type="text" placeholder="enter some text">
`,
})
export class TwoComponent {}