diff --git a/angular/src/index.ts b/angular/src/index.ts index e8ab96999b..bd696901a9 100644 --- a/angular/src/index.ts +++ b/angular/src/index.ts @@ -13,5 +13,8 @@ export * from './providers'; // ionic types export * from './types/interfaces'; +// ionic oute reuse strategy +export * from './util/ionic-router-reuse-strategy'; + /*tslint:disable*/ import './ionic-angular'; diff --git a/angular/src/util/ionic-router-reuse-strategy.ts b/angular/src/util/ionic-router-reuse-strategy.ts new file mode 100644 index 0000000000..67f7cd3c21 --- /dev/null +++ b/angular/src/util/ionic-router-reuse-strategy.ts @@ -0,0 +1,28 @@ +import { ActivatedRouteSnapshot, DetachedRouteHandle, RouteReuseStrategy } from '@angular/router'; +import { deepEqual, objectValues } from './util'; + +export class IonicRouteStrategy implements RouteReuseStrategy { + + shouldDetach(_route: ActivatedRouteSnapshot): boolean { + return false; + } + + // tslint:disable-next-line + store(_route: ActivatedRouteSnapshot, _detachedTree: DetachedRouteHandle): void { } + + shouldAttach(_route: ActivatedRouteSnapshot): boolean { + return false; + } + + retrieve(_route: ActivatedRouteSnapshot): DetachedRouteHandle | null { + return null; + } + + shouldReuseRoute(future: ActivatedRouteSnapshot, curr: ActivatedRouteSnapshot): boolean { + if (objectValues(future.params) && objectValues(curr.params)) { + return deepEqual(future.params, curr.params); + } else { + return future.routeConfig === curr.routeConfig; + } + } +} diff --git a/angular/src/util/util.ts b/angular/src/util/util.ts index 5a304c595a..d6dd904db4 100644 --- a/angular/src/util/util.ts +++ b/angular/src/util/util.ts @@ -12,3 +12,24 @@ export function ensureElementInBody(elementName: string) { } return element as HTMLStencilElement; } + +export function objectValues(obj: any): any[] { + return Object.keys(obj).map(key => obj[key]); +} + +export function deepEqual(x: any, y: any) { + if (x === y) { + return true; + } else if (typeof x === 'object' && x != null && (typeof y === 'object' && y != null)) { + if (Object.keys(x).length !== Object.keys(y).length) return false; + + for (const prop in x) { + if (y.hasOwnProperty(prop)) { + if (!deepEqual(x[prop], y[prop])) return false; + } else return false; + } + + return true; + } else return false; +} +