Angular 路由機制中,有一個選項是 routeReuseStrategy
,這一個設定可以讓我們設定路由轉換的過程中,是否要保留 component 並重複使用,而相關的使用方式如下
設定
首先,先建立一個 Class 並實作 RouteReuseStrategy
介面,RouteReuseStrategy
介面包含了五個方法需要被實作
1 2 3 4 5 6 7
| abstract class RouteReuseStrategy { abstract shouldDetach(route: ActivatedRouteSnapshot): boolean abstract store(route: ActivatedRouteSnapshot, handle: DetachedRouteHandle): void abstract shouldAttach(route: ActivatedRouteSnapshot): boolean abstract retrieve(route: ActivatedRouteSnapshot): DetachedRouteHandle | null abstract shouldReuseRoute(future: ActivatedRouteSnapshot, curr: ActivatedRouteSnapshot): boolean }
|
- shouldDetach : 判斷路由是否能重複使用
- store : 將脫離的路由內容暫存起來
- shouldAttach : 當路由進入時,可判斷是否還原路由暫存內容
- retrieve : 從 Cache 中取得對應的暫存內容
- shouldReuseRoute : 判斷是否同一路由
基本範例程式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
| import { RouteReuseStrategy, DefaultUrlSerializer, ActivatedRouteSnapshot, DetachedRouteHandle } from '@angular/router';
export class AppRoutingCache implements RouteReuseStrategy { public static handlers: { [key: string]: DetachedRouteHandle } = {};
public shouldDetach(route: ActivatedRouteSnapshot): boolean { return true; }
public store( route: ActivatedRouteSnapshot, handle: DetachedRouteHandle ): void { AppRoutingCache.handlers[route.routeConfig.path] = handle; }
public shouldAttach(route: ActivatedRouteSnapshot): boolean { return ( !!route.routeConfig && !!AppRoutingCache.handlers[route.routeConfig.path] ); } public retrieve(route: ActivatedRouteSnapshot): DetachedRouteHandle { if (!route.routeConfig) { return null; } return AppRoutingCache.handlers[route.routeConfig.path]; }
public shouldReuseRoute( future: ActivatedRouteSnapshot, current: ActivatedRouteSnapshot ): boolean { return future.routeConfig === current.routeConfig; } }
|
註冊
將寫好的 class 註冊在 RootModule
的 proivders
的區塊中即可
1
| providers: [{ provide: RouteReuseStrategy, useClass: AppRoutingCache }],
|
當這樣子設定完成後,Angular 路由機制就會依照我們實作的 RouteReuseStrategy
來管理路由的相關資訊,內包含 ComponentRef
,效果會是當我們重新返回該路由時,原本輸入的資料還會存在。因為是使用當時離開時的 Component 而不是重新建立一個新的。
實際的操作效果可以參考 範例程式
參考資料