pull/1/head
parent
4bf838ffc2
commit
6c0b1e5bf0
@ -0,0 +1,79 @@ |
|||||||
|
import { Injectable } from '@angular/core'; |
||||||
|
import { RouteReuseStrategy, DetachedRouteHandle, ActivatedRouteSnapshot } from '@angular/router'; |
||||||
|
|
||||||
|
@Injectable({ |
||||||
|
providedIn: 'root' |
||||||
|
}) |
||||||
|
export class RouteStrategyService implements RouteReuseStrategy { |
||||||
|
|
||||||
|
public static handlers: { [key: string]: DetachedRouteHandle } = {}; |
||||||
|
public static deleteRouteSnapshot(path: string): void { |
||||||
|
const name = path.replace(/\//g, '_'); |
||||||
|
if (RouteStrategyService.handlers[name]) { |
||||||
|
delete RouteStrategyService.handlers[name]; |
||||||
|
} |
||||||
|
} |
||||||
|
/** |
||||||
|
* 判断当前路由是否需要缓存 |
||||||
|
* 这个方法返回false时则路由发生变化并且其余方法会被调用 |
||||||
|
* @param {ActivatedRouteSnapshot} future |
||||||
|
* @param {ActivatedRouteSnapshot} curr |
||||||
|
* @returns {boolean} |
||||||
|
* @memberof CacheRouteReuseStrategy |
||||||
|
*/ |
||||||
|
public shouldReuseRoute(future: ActivatedRouteSnapshot, curr: ActivatedRouteSnapshot): boolean { |
||||||
|
return future.routeConfig === curr.routeConfig |
||||||
|
&& JSON.stringify(future.params) === JSON.stringify(curr.params); |
||||||
|
} |
||||||
|
/** |
||||||
|
* 当离开当前路由时这个方法会被调用 |
||||||
|
* 如果返回 true 则 store 方法会被调用 |
||||||
|
* @param {ActivatedRouteSnapshot} route |
||||||
|
* @returns {boolean} |
||||||
|
* @memberof CacheRouteReuseStrategy |
||||||
|
*/ |
||||||
|
public shouldDetach(route: ActivatedRouteSnapshot): boolean { |
||||||
|
if (!route.routeConfig || route.routeConfig.loadChildren) { |
||||||
|
return false |
||||||
|
} |
||||||
|
return true |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 将路由写入缓存 |
||||||
|
* 在这里具体实现如何缓存 RouteHandle |
||||||
|
* 提供了我们离开的路由和 RouteHandle |
||||||
|
* @param {ActivatedRouteSnapshot} route |
||||||
|
* @param {DetachedRouteHandle} detachedTree |
||||||
|
* @memberof CacheRouteReuseStrategy |
||||||
|
*/ |
||||||
|
public store(route: ActivatedRouteSnapshot, detachedTree: DetachedRouteHandle): void { |
||||||
|
RouteStrategyService.handlers[this.getPath(route)] = detachedTree; |
||||||
|
} |
||||||
|
/** |
||||||
|
* 路由被导航 如果此方法返回 true 则触发 retrieve 方法 |
||||||
|
* 如果返回 false 这个组件将会被重新创建 |
||||||
|
* @param {ActivatedRouteSnapshot} route |
||||||
|
* @returns {boolean} |
||||||
|
* @memberof CacheRouteReuseStrategy |
||||||
|
*/ |
||||||
|
public shouldAttach(route: ActivatedRouteSnapshot): boolean { |
||||||
|
return !!RouteStrategyService.handlers[this.getPath(route)]; |
||||||
|
} |
||||||
|
/** |
||||||
|
* 从缓存读取cached route |
||||||
|
* 提供当前路由的参数(刚打开的路由),并且返回一个缓存的 RouteHandle |
||||||
|
* 可以使用这个方法手动获取任何已被缓存的 RouteHandle |
||||||
|
* @param {ActivatedRouteSnapshot} route |
||||||
|
* @returns {(DetachedRouteHandle | null)} |
||||||
|
* @memberof CacheRouteReuseStrategy |
||||||
|
*/ |
||||||
|
public retrieve(route: ActivatedRouteSnapshot): DetachedRouteHandle | null { |
||||||
|
return RouteStrategyService.handlers[this.getPath(route)] || null; |
||||||
|
} |
||||||
|
private getPath(route: ActivatedRouteSnapshot): string { |
||||||
|
// tslint:disable-next-line: no-string-literal
|
||||||
|
return route['_routerState'].url.replace(/\//g, '_') |
||||||
|
+ '_' + (route.routeConfig.loadChildren || route.routeConfig.component.toString().split('(')[0].split(' ')[1] ); |
||||||
|
} |
||||||
|
} |
Loading…
Reference in new issue