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 6810a04143
commit 7b1d63e939
2 changed files with 16 additions and 21 deletions

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;

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.
*