refactor(router): Move configLoader to transition handler (#48202)

The ConfigLoader is only used as part of the navigation transition.
Moving the loader there completes the removal of event triggering in
the router code. This all now lives in the transition handler (plus
the router scroller, but let's ignore that...).

PR Close #48202
This commit is contained in:
Andrew Scott
2022-11-16 15:45:11 -08:00
committed by Andrew Scott
parent f555050f9a
commit bec2e79e81
2 changed files with 16 additions and 21 deletions
+13 -6
View File
@@ -7,13 +7,13 @@
*/
import {Location} from '@angular/common';
import {Injectable, NgModuleRef, Type} from '@angular/core';
import {inject, Injectable, NgModuleRef, Type} from '@angular/core';
import {BehaviorSubject, combineLatest, EMPTY, Observable, of, Subject} from 'rxjs';
import {catchError, defaultIfEmpty, filter, finalize, map, switchMap, take, tap} from 'rxjs/operators';
import {createRouterState} from './create_router_state';
import {Event, GuardsCheckEnd, GuardsCheckStart, NavigationCancel, NavigationCancellationCode, NavigationEnd, NavigationError, NavigationSkipped, NavigationSkippedCode, NavigationStart, NavigationTrigger, ResolveEnd, ResolveStart, RoutesRecognized} from './events';
import {NavigationBehaviorOptions, QueryParamsHandling, Routes} from './models';
import {Event, GuardsCheckEnd, GuardsCheckStart, NavigationCancel, NavigationCancellationCode, NavigationEnd, NavigationError, NavigationSkipped, NavigationSkippedCode, NavigationStart, NavigationTrigger, ResolveEnd, ResolveStart, RouteConfigLoadEnd, RouteConfigLoadStart, RoutesRecognized} from './events';
import {NavigationBehaviorOptions, QueryParamsHandling, Route, Routes} from './models';
import {isNavigationCancelingError, isRedirectingNavigationCancelingError, redirectingNavigationError} from './navigation_canceling_error';
import {activateRoutes} from './operators/activate_routes';
import {applyRedirects} from './operators/apply_redirects';
@@ -268,7 +268,6 @@ interface InternalRouterInterface {
rawUrlTree: UrlTree;
transitions: BehaviorSubject<NavigationTransition>;
navigationId: number;
configLoader: RouterConfigLoader;
ngModule: NgModuleRef<any>;
readonly routerState: RouterState;
errorHandler: ErrorHandler;
@@ -299,6 +298,14 @@ export class NavigationTransitions {
currentNavigation: Navigation|null = null;
lastSuccessfulNavigation: Navigation|null = null;
readonly events = new Subject<Event>();
private readonly configLoader = inject(RouterConfigLoader);
constructor() {
const onLoadStart = (r: Route) => this.events.next(new RouteConfigLoadStart(r));
const onLoadEnd = (r: Route) => this.events.next(new RouteConfigLoadEnd(r));
this.configLoader.onLoadEndListener = onLoadEnd;
this.configLoader.onLoadStartListener = onLoadStart;
}
setupNavigations(transitions: Observable<NavigationTransition>, router: InternalRouterInterface):
Observable<NavigationTransition> {
@@ -380,7 +387,7 @@ export class NavigationTransitions {
// ApplyRedirects
applyRedirects(
router.ngModule.injector, router.configLoader,
router.ngModule.injector, this.configLoader,
router.urlSerializer, router.config),
// Update the currentNavigation
@@ -556,7 +563,7 @@ export class NavigationTransitions {
const loaders: Array<Observable<void>> = [];
if (route.routeConfig?.loadComponent &&
!route.routeConfig._loadedComponent) {
loaders.push(router.configLoader.loadComponent(route.routeConfig)
loaders.push(this.configLoader.loadComponent(route.routeConfig)
.pipe(
tap(loadedComponent => {
route.component = loadedComponent;
+3 -15
View File
@@ -12,13 +12,13 @@ import {BehaviorSubject, Observable, of, SubscriptionLike} from 'rxjs';
import {createUrlTree} from './create_url_tree';
import {RuntimeErrorCode} from './errors';
import {Event, NavigationCancel, NavigationCancellationCode, NavigationTrigger, RouteConfigLoadEnd, RouteConfigLoadStart} from './events';
import {NavigationBehaviorOptions, OnSameUrlNavigation, Route, Routes} from './models';
import {Event, NavigationTrigger} from './events';
import {NavigationBehaviorOptions, OnSameUrlNavigation, Routes} from './models';
import {Navigation, NavigationExtras, NavigationTransition, NavigationTransitions, RestoredState, UrlCreationOptions} from './navigation_transition';
import {TitleStrategy} from './page_title_strategy';
import {RouteReuseStrategy} from './route_reuse_strategy';
import {ErrorHandler, ExtraOptions, ROUTER_CONFIGURATION} from './router_config';
import {RouterConfigLoader, ROUTES} from './router_config_loader';
import {ROUTES} from './router_config_loader';
import {ChildrenOutletContexts} from './router_outlet_context';
import {createEmptyState, RouterState} from './router_state';
import {Params} from './shared';
@@ -202,8 +202,6 @@ export class Router {
return (this.location.getState() as RestoredState | null)?.ɵrouterPageId;
}
/** @internal */
configLoader: RouterConfigLoader;
/** @internal */
ngModule: NgModuleRef<any>;
private console: Console;
private isNgZoneEnabled: boolean = false;
@@ -368,12 +366,6 @@ export class Router {
compiler: Compiler,
public config: Routes,
) {
const onLoadStart = (r: Route) => this.triggerEvent(new RouteConfigLoadStart(r));
const onLoadEnd = (r: Route) => this.triggerEvent(new RouteConfigLoadEnd(r));
this.configLoader = injector.get(RouterConfigLoader);
this.configLoader.onLoadEndListener = onLoadEnd;
this.configLoader.onLoadStartListener = onLoadStart;
this.ngModule = injector.get(NgModuleRef);
this.console = injector.get(Console);
const ngZone = injector.get(NgZone);
@@ -496,10 +488,6 @@ export class Router {
return this.navigationTransitions.currentNavigation;
}
private triggerEvent(event: Event): void {
this.navigationTransitions.events.next(event);
}
/**
* Resets the route configuration used for navigation and generating links.
*