diff --git a/packages/router/src/navigation_transition.ts b/packages/router/src/navigation_transition.ts index 82e01c207a7..5de1fd419ec 100644 --- a/packages/router/src/navigation_transition.ts +++ b/packages/router/src/navigation_transition.ts @@ -443,6 +443,7 @@ export class NavigationTransitions { // Using switchMap so we cancel executing navigations when a new one comes in switchMap((overallTransitionState) => { + let abortable = true; let completedOrAborted = false; const abortController = new AbortController(); const shouldContinueNavigation = () => { @@ -738,6 +739,20 @@ export class NavigationTransitions { return loaders.length === 0 ? of(t) : from(Promise.all(loaders).then(() => t)); }), + switchMap((t: NavigationTransition) => { + const targetRouterState = createRouterState( + router.routeReuseStrategy, + t.targetSnapshot!, + t.currentRouterState, + ); + this.currentTransition = overallTransitionState = t = {...t, targetRouterState}; + this.currentNavigation.update((nav) => { + nav!.targetRouterState = targetRouterState; + return nav; + }); + return of(t); + }), + switchTap(() => this.afterPreactivation()), // TODO(atscott): Move this into the last block below. @@ -762,17 +777,7 @@ export class NavigationTransitions { take(1), switchMap((t: NavigationTransition) => { - const targetRouterState = createRouterState( - router.routeReuseStrategy, - t.targetSnapshot!, - t.currentRouterState, - ); - this.currentTransition = overallTransitionState = t = {...t, targetRouterState}; - this.currentNavigation.update((nav) => { - nav!.targetRouterState = targetRouterState; - return nav; - }); - + abortable = false; this.events.next(new BeforeActivateRoutes()); const deferred = overallTransitionState.beforeActivateHandler.deferredHandle; return deferred ? from(deferred.then(() => t)) : of(t); @@ -811,7 +816,7 @@ export class NavigationTransitions { takeUntil( abortSignalToObservable(abortController.signal).pipe( // Ignore aborts if we are already completed, canceled, or are in the activation stage (we have targetRouterState) - filter(() => !completedOrAborted && !overallTransitionState.targetRouterState), + filter(() => !completedOrAborted && abortable), tap(() => { this.cancelNavigationTransition( overallTransitionState,