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