From bdd5109dbeef25fd68ef2b9eff0a40f82ec21a8b Mon Sep 17 00:00:00 2001 From: Liam DeBeasi Date: Mon, 20 May 2019 11:56:02 -0400 Subject: [PATCH] fix(angular): preserve queryParams and fragment when going back (#18298) fixes #16744 --- .../src/directives/navigation/ion-router-outlet.ts | 14 ++++++++++++++ .../src/directives/navigation/stack-controller.ts | 2 +- angular/src/directives/navigation/stack-utils.ts | 3 ++- angular/src/providers/nav-controller.ts | 11 ++++++++++- 4 files changed, 27 insertions(+), 3 deletions(-) diff --git a/angular/src/directives/navigation/ion-router-outlet.ts b/angular/src/directives/navigation/ion-router-outlet.ts index a95e45d232..32d88842a0 100644 --- a/angular/src/directives/navigation/ion-router-outlet.ts +++ b/angular/src/directives/navigation/ion-router-outlet.ts @@ -141,6 +141,20 @@ export class IonRouterOutlet implements OnDestroy, OnInit { if (this.activated) { if (this.activatedView) { this.activatedView.savedData = new Map(this.getContext()!.children['contexts']); + + /** + * Ensure we are saving the NavigationExtras + * data otherwise it will be lost + */ + this.activatedView.savedExtras = {}; + const context = this.getContext()!; + + if (context.route) { + const contextSnapshot = context.route.snapshot; + + this.activatedView.savedExtras.queryParams = contextSnapshot.queryParams; + this.activatedView.savedExtras.fragment = contextSnapshot.fragment; + } } const c = this.component; this.activatedView = null; diff --git a/angular/src/directives/navigation/stack-controller.ts b/angular/src/directives/navigation/stack-controller.ts index a06eb0491c..ebafaf9bf8 100644 --- a/angular/src/directives/navigation/stack-controller.ts +++ b/angular/src/directives/navigation/stack-controller.ts @@ -132,7 +132,7 @@ export class StackController { } } - return this.navCtrl.navigateBack(url).then(() => true); + return this.navCtrl.navigateBack(url, view.savedExtras).then(() => true); }); } diff --git a/angular/src/directives/navigation/stack-utils.ts b/angular/src/directives/navigation/stack-utils.ts index cf380e5d7b..f52c5b36bb 100644 --- a/angular/src/directives/navigation/stack-utils.ts +++ b/angular/src/directives/navigation/stack-utils.ts @@ -1,5 +1,5 @@ import { ComponentRef } from '@angular/core'; -import { ActivatedRoute, Router } from '@angular/router'; +import { ActivatedRoute, NavigationExtras, Router } from '@angular/router'; import { NavDirection, RouterDirection } from '@ionic/core'; export function insertView(views: RouteView[], view: RouteView, direction: RouterDirection) { @@ -94,5 +94,6 @@ export interface RouteView { element: HTMLElement; ref: ComponentRef; savedData?: any; + savedExtras?: NavigationExtras; unlistenEvents: () => void; } diff --git a/angular/src/providers/nav-controller.ts b/angular/src/providers/nav-controller.ts index 7fb4cb21a7..def3c2b63d 100644 --- a/angular/src/providers/nav-controller.ts +++ b/angular/src/providers/nav-controller.ts @@ -184,7 +184,16 @@ export class NavController { if (Array.isArray(url)) { return this.router!.navigate(url, options); } else { - return this.router!.navigateByUrl(url, options); + + /** + * navigateByUrl ignores any properties that + * would change the url, so things like queryParams + * would be ignored unless we create a url tree + * More Info: https://github.com/angular/angular/issues/18798 + */ + return this.router!.navigateByUrl( + this.router!.createUrlTree([url], options) + ); } } }