diff --git a/packages/router/src/operators/after_preactivation.ts b/packages/router/src/operators/after_preactivation.ts new file mode 100644 index 0000000000..d31ae9f36e --- /dev/null +++ b/packages/router/src/operators/after_preactivation.ts @@ -0,0 +1,29 @@ +/** + * @license + * Copyright Google Inc. All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */ + +import {MonoTypeOperatorFunction} from 'rxjs'; +import {map, mergeMap} from 'rxjs/operators'; + +import {RouterHook} from '../router'; +import {RouterStateSnapshot} from '../router_state'; +import {UrlTree} from '../url_tree'; + +export function afterPreactivation( + hook: RouterHook, navigationId: number, appliedUrlTree: UrlTree, rawUrlTree: UrlTree, + skipLocationChange: boolean, replaceUrl: boolean): + MonoTypeOperatorFunction<{appliedUrl: UrlTree, snapshot: RouterStateSnapshot}> { + return function(source) { + return source.pipe(mergeMap( + p => hook( + p.snapshot, + { + navigationId, appliedUrlTree, rawUrlTree, skipLocationChange, replaceUrl, + }) + .pipe(map(() => p)))); + }; +} diff --git a/packages/router/src/router.ts b/packages/router/src/router.ts index 087c1b66cb..5cf0fda603 100644 --- a/packages/router/src/router.ts +++ b/packages/router/src/router.ts @@ -31,6 +31,7 @@ import {DefaultUrlHandlingStrategy, UrlHandlingStrategy} from './url_handling_st import {UrlSerializer, UrlTree, containsTree, createEmptyUrlTree} from './url_tree'; import {forEach} from './utils/collection'; import {TreeNode, nodeChildrenAsMap} from './utils/tree'; +import { afterPreactivation } from './operators/after_preactivation'; @@ -769,17 +770,13 @@ export class Router { of (p) )); - const preactivationDone$ = - preactivationResolveData$.pipe(mergeMap((p): Observable => { - if (typeof p === 'boolean' || this.navigationId !== id) return of (false); - return this.hooks - .afterPreactivation(p.snapshot, { - navigationId: id, - appliedUrlTree: url, - rawUrlTree: rawUrl, skipLocationChange, replaceUrl, - }) - .pipe(map(() => p)); - })); + const preactivationDone$: Observable = + preactivationResolveData$.pipe(mergeMap(p => + typeof p === 'boolean' || this.navigationId !== id ? of (false) : + of (p).pipe( + afterPreactivation(this.hooks.afterPreactivation, id, url, rawUrl, skipLocationChange, replaceUrl), + map(() => p)) + )); // create router state