feat(router): add "paramsInheritanceStrategy" router configuration option
Previously, the router would merge path and matrix params, as well as data/resolve, with special rules (only merging down when the route has an empty path, or is component-less). This change adds an extra option "paramsInheritanceStrategy" which, when set to 'always', makes child routes unconditionally inherit params from parent routes. Closes #20572.
This commit is contained in:

committed by
Alex Rickabaugh

parent
5f23a1223f
commit
5efea2f6a0
@ -9,7 +9,7 @@
|
||||
import {Location, LocationStrategy} from '@angular/common';
|
||||
import {MockLocationStrategy, SpyLocation} from '@angular/common/testing';
|
||||
import {Compiler, Injectable, Injector, ModuleWithProviders, NgModule, NgModuleFactory, NgModuleFactoryLoader, Optional} from '@angular/core';
|
||||
import {ChildrenOutletContexts, NoPreloading, PreloadingStrategy, ROUTES, Route, Router, RouterModule, Routes, UrlHandlingStrategy, UrlSerializer, provideRoutes, ɵROUTER_PROVIDERS as ROUTER_PROVIDERS, ɵflatten as flatten} from '@angular/router';
|
||||
import {ChildrenOutletContexts, ExtraOptions, NoPreloading, PreloadingStrategy, ROUTER_CONFIGURATION, ROUTES, Route, Router, RouterModule, Routes, UrlHandlingStrategy, UrlSerializer, provideRoutes, ɵROUTER_PROVIDERS as ROUTER_PROVIDERS, ɵflatten as flatten} from '@angular/router';
|
||||
|
||||
|
||||
|
||||
@ -76,6 +76,13 @@ export class SpyNgModuleFactoryLoader implements NgModuleFactoryLoader {
|
||||
}
|
||||
}
|
||||
|
||||
function isUrlHandlingStrategy(opts: ExtraOptions | UrlHandlingStrategy):
|
||||
opts is UrlHandlingStrategy {
|
||||
// This property check is needed because UrlHandlingStrategy is an interface and doesn't exist at
|
||||
// runtime.
|
||||
return 'shouldProcessUrl' in opts;
|
||||
}
|
||||
|
||||
/**
|
||||
* Router setup factory function used for testing.
|
||||
*
|
||||
@ -84,9 +91,39 @@ export class SpyNgModuleFactoryLoader implements NgModuleFactoryLoader {
|
||||
export function setupTestingRouter(
|
||||
urlSerializer: UrlSerializer, contexts: ChildrenOutletContexts, location: Location,
|
||||
loader: NgModuleFactoryLoader, compiler: Compiler, injector: Injector, routes: Route[][],
|
||||
urlHandlingStrategy?: UrlHandlingStrategy) {
|
||||
opts?: ExtraOptions, urlHandlingStrategy?: UrlHandlingStrategy): Router;
|
||||
|
||||
/**
|
||||
* Router setup factory function used for testing.
|
||||
*
|
||||
* @deprecated As of v5.2. The 2nd-to-last argument should be `ExtraOptions`, not
|
||||
* `UrlHandlingStrategy`
|
||||
*/
|
||||
export function setupTestingRouter(
|
||||
urlSerializer: UrlSerializer, contexts: ChildrenOutletContexts, location: Location,
|
||||
loader: NgModuleFactoryLoader, compiler: Compiler, injector: Injector, routes: Route[][],
|
||||
urlHandlingStrategy?: UrlHandlingStrategy): Router;
|
||||
|
||||
/**
|
||||
* Router setup factory function used for testing.
|
||||
*
|
||||
* @stable
|
||||
*/
|
||||
export function setupTestingRouter(
|
||||
urlSerializer: UrlSerializer, contexts: ChildrenOutletContexts, location: Location,
|
||||
loader: NgModuleFactoryLoader, compiler: Compiler, injector: Injector, routes: Route[][],
|
||||
opts?: ExtraOptions | UrlHandlingStrategy, urlHandlingStrategy?: UrlHandlingStrategy) {
|
||||
const router = new Router(
|
||||
null !, urlSerializer, contexts, location, injector, loader, compiler, flatten(routes));
|
||||
// Handle deprecated argument ordering.
|
||||
if (opts) {
|
||||
if (isUrlHandlingStrategy(opts)) {
|
||||
router.urlHandlingStrategy = opts;
|
||||
} else if (opts.paramsInheritanceStrategy) {
|
||||
router.paramsInheritanceStrategy = opts.paramsInheritanceStrategy;
|
||||
}
|
||||
}
|
||||
|
||||
if (urlHandlingStrategy) {
|
||||
router.urlHandlingStrategy = urlHandlingStrategy;
|
||||
}
|
||||
@ -128,14 +165,20 @@ export function setupTestingRouter(
|
||||
useFactory: setupTestingRouter,
|
||||
deps: [
|
||||
UrlSerializer, ChildrenOutletContexts, Location, NgModuleFactoryLoader, Compiler, Injector,
|
||||
ROUTES, [UrlHandlingStrategy, new Optional()]
|
||||
ROUTES, ROUTER_CONFIGURATION, [UrlHandlingStrategy, new Optional()]
|
||||
]
|
||||
},
|
||||
{provide: PreloadingStrategy, useExisting: NoPreloading}, provideRoutes([])
|
||||
]
|
||||
})
|
||||
export class RouterTestingModule {
|
||||
static withRoutes(routes: Routes): ModuleWithProviders {
|
||||
return {ngModule: RouterTestingModule, providers: [provideRoutes(routes)]};
|
||||
static withRoutes(routes: Routes, config?: ExtraOptions): ModuleWithProviders {
|
||||
return {
|
||||
ngModule: RouterTestingModule,
|
||||
providers: [
|
||||
provideRoutes(routes),
|
||||
{provide: ROUTER_CONFIGURATION, useValue: config ? config : {}},
|
||||
]
|
||||
};
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user