example - router events angular 6
Angular2 no funciona Estrategia de reutilización personalizada con módulo perezoso de carga (4)
Usa este. Utiliza el nombre del componente como la clave para almacenar y recuperar los Controles.
import {ActivatedRouteSnapshot, DetachedRouteHandle, RouteReuseStrategy} from ''@angular/router'';
export class CustomReuseStrategy implements RouteReuseStrategy {
handlers: { [key: string]: DetachedRouteHandle } = {};
shouldDetach(route: ActivatedRouteSnapshot): boolean {
return true;
}
store(route: ActivatedRouteSnapshot, handle: DetachedRouteHandle): void {
this.handlers[this.getKey(route)] = handle;
}
shouldAttach(route: ActivatedRouteSnapshot): boolean {
return !!route.routeConfig && !!this.handlers[this.getKey(route)];
}
retrieve(route: ActivatedRouteSnapshot): DetachedRouteHandle {
if (!route.routeConfig) {
return null;
}
return this.handlers[this.getKey(route)];
}
shouldReuseRoute(future: ActivatedRouteSnapshot, curr: ActivatedRouteSnapshot): boolean {
return curr.routeConfig === future.routeConfig;
}
private getKey(route: ActivatedRouteSnapshot) {
let key: string;
if (route.component) {
key = route.component[''name''];
} else {
key = route.firstChild.component[''name''];
}
return key;
}
}
Intenté usar una estrategia de reutilización personalizada en mi proyecto angular2, pero descubrí que no funciona con la carga de módulos vagos . ¿Alguien que sepa sobre esto? Mi proyecto es angular 2.6.4
reuse-strategy.ts
import {RouteReuseStrategy, ActivatedRouteSnapshot, DetachedRouteHandle} from "@angular/router";
export class CustomReuseStrategy implements RouteReuseStrategy {
handlers: {[key: string]: DetachedRouteHandle} = {};
shouldDetach(route: ActivatedRouteSnapshot): boolean {
console.debug(''CustomReuseStrategy:shouldDetach'', route);
return true;
}
store(route: ActivatedRouteSnapshot, handle: DetachedRouteHandle): void {
console.debug(''CustomReuseStrategy:store'', route, handle);
this.handlers[route.routeConfig.path] = handle;
}
shouldAttach(route: ActivatedRouteSnapshot): boolean {
console.debug(''CustomReuseStrategy:shouldAttach'', route);
return !!route.routeConfig && !!this.handlers[route.routeConfig.path];
}
retrieve(route: ActivatedRouteSnapshot): DetachedRouteHandle {
console.debug(''CustomReuseStrategy:retrieve'', route);
if (!route.routeConfig) return null;
return this.handlers[route.routeConfig.path];
}
shouldReuseRoute(future: ActivatedRouteSnapshot, curr: ActivatedRouteSnapshot): boolean {
console.debug(''CustomReuseStrategy:shouldReuseRoute'', future, curr);
return future.routeConfig === curr.routeConfig;
}
}
app.module.ts
const appRoutes: Routes = [
{ path: ''crisis-center'', component: CrisisListComponent },
{ path: ''heroes'', loadChildren: ''app/hero-list.module#HeroListModule'' },
{ path: '''', redirectTo: ''/crisis-center'', pathMatch: ''full'' }
];
@NgModule({
imports: [ ... ],
declarations: [ ... ],
providers:[
{provide: RouteReuseStrategy, useClass: CustomReuseStrategy}
],
bootstrap: [ AppComponent ]
})
export class AppModule { }
y puse <input>
en ambos componentes y lo probé.
el valor de la entrada en CrisisListComponent
se almacena, pero el valor de HeroListComponent lazy-loaded
no se conserva.
No sé todavía no es compatible. Gracias por ayudarme.
usa esta ReuseStrategy
import { ActivatedRouteSnapshot, DetachedRouteHandle, RouteReuseStrategy } from ''@angular/router'';
export class CustomReuseStrategy implements RouteReuseStrategy {
private handlers: {[key: string]: DetachedRouteHandle} = {};
constructor() {
}
shouldDetach(route: ActivatedRouteSnapshot): boolean {
return true;
}
store(route: ActivatedRouteSnapshot, handle: DetachedRouteHandle): void {
this.handlers[route.url.join("/") || route.parent.url.join("/")] = handle;
}
shouldAttach(route: ActivatedRouteSnapshot): boolean {
return !!this.handlers[route.url.join("/") || route.parent.url.join("/")];
}
retrieve(route: ActivatedRouteSnapshot): DetachedRouteHandle {
return this.handlers[route.url.join("/") || route.parent.url.join("/")];
}
shouldReuseRoute(future: ActivatedRouteSnapshot, curr: ActivatedRouteSnapshot): boolean {
return future.routeConfig === curr.routeConfig;
}
}
RouteReuseStrategy
funciona con componentes LazyLoaded.
El problema aquí es que está utilizando route.routeConfig.path
como la clave para almacenar y recuperar los identificadores.
No sé por qué, pero con los módulos route.routeConfig.path
, route.routeConfig.path
está vacío al ejecutar shouldAttach
La solución que uso es definir una clave personalizada en mis rutas, como:
{ path: ''...'', loadChildren: ''...module#...Module'', data: { key: ''custom_key'' } }
Se puede acceder fácilmente a este valor de clave en ActivatedRouteSnapshot
, como:
route.data.key
Con esta clave puede almacenar y recuperar los controladores correctamente.
utilice este archivo de Estrategia de Reutilización personalizado para la carga del módulo diferido
import { ActivatedRouteSnapshot, RouteReuseStrategy, DetachedRouteHandle } from ''@angular/router'';
/** Interface for object which can store both:
* An ActivatedRouteSnapshot, which is useful for determining whether or not you should attach a route (see this.shouldAttach)
* A DetachedRouteHandle, which is offered up by this.retrieve, in the case that you do want to attach the stored route
*/
interface RouteStorageObject {
snapshot: ActivatedRouteSnapshot;
handle: DetachedRouteHandle;
}
export class CustomReuseStrategy implements RouteReuseStrategy {
handlers: {[key: string]: DetachedRouteHandle} = {};
shouldDetach(route: ActivatedRouteSnapshot): boolean {
console.debug(''CustomReuseStrategy:shouldDetach'', route);
return !!route.data && !!(route.data as any).shouldDetach;
}
store(route: ActivatedRouteSnapshot, handle: DetachedRouteHandle): void {
console.debug(''CustomReuseStrategy:store'', route, handle);
this.handlers[route.data[''key'']]= handle;
}
shouldAttach(route: ActivatedRouteSnapshot): boolean {
console.debug(''CustomReuseStrategy:shouldAttach'', route);
return !!route.data && !!this.handlers[route.data[''key'']];
}
retrieve(route: ActivatedRouteSnapshot): DetachedRouteHandle {
console.debug(''CustomReuseStrategy:retrieve'', route);
if (!route.data) return null;
return this.handlers[route.data[''key'']];
}
shouldReuseRoute(future: ActivatedRouteSnapshot, curr: ActivatedRouteSnapshot): boolean {
console.debug(''CustomReuseStrategy:shouldReuseRoute'', future, curr);
return future.data === curr.data;
}
}