fix(router): fix wildcard route with lazy loaded module (again) (#18139)
Closes #13848 Description: We doesn't handle children of wildcard route properly link. It's always an empty array. Created from #13851 PR Close #18139
This commit is contained in:
parent
07b81ae741
commit
5ba1cf1063
|
@ -111,29 +111,33 @@ class Recognizer {
|
||||||
|
|
||||||
if ((route.outlet || PRIMARY_OUTLET) !== outlet) throw new NoMatch();
|
if ((route.outlet || PRIMARY_OUTLET) !== outlet) throw new NoMatch();
|
||||||
|
|
||||||
|
let snapshot: ActivatedRouteSnapshot;
|
||||||
|
let consumedSegments: UrlSegment[] = [];
|
||||||
|
let rawSlicedSegments: UrlSegment[] = [];
|
||||||
|
|
||||||
if (route.path === '**') {
|
if (route.path === '**') {
|
||||||
const params = segments.length > 0 ? last(segments) !.parameters : {};
|
const params = segments.length > 0 ? last(segments) !.parameters : {};
|
||||||
const snapshot = new ActivatedRouteSnapshot(
|
snapshot = new ActivatedRouteSnapshot(
|
||||||
segments, params, Object.freeze(this.urlTree.queryParams), this.urlTree.fragment !,
|
segments, params, Object.freeze(this.urlTree.queryParams), this.urlTree.fragment !,
|
||||||
getData(route), outlet, route.component !, route, getSourceSegmentGroup(rawSegment),
|
getData(route), outlet, route.component !, route, getSourceSegmentGroup(rawSegment),
|
||||||
getPathIndexShift(rawSegment) + segments.length, getResolve(route));
|
getPathIndexShift(rawSegment) + segments.length, getResolve(route));
|
||||||
return [new TreeNode<ActivatedRouteSnapshot>(snapshot, [])];
|
} else {
|
||||||
|
const result: MatchResult = match(rawSegment, route, segments);
|
||||||
|
consumedSegments = result.consumedSegments;
|
||||||
|
rawSlicedSegments = segments.slice(result.lastChild);
|
||||||
|
|
||||||
|
snapshot = new ActivatedRouteSnapshot(
|
||||||
|
consumedSegments, result.parameters, Object.freeze(this.urlTree.queryParams),
|
||||||
|
this.urlTree.fragment !, getData(route), outlet, route.component !, route,
|
||||||
|
getSourceSegmentGroup(rawSegment),
|
||||||
|
getPathIndexShift(rawSegment) + consumedSegments.length, getResolve(route));
|
||||||
}
|
}
|
||||||
|
|
||||||
const {consumedSegments, parameters, lastChild} = match(rawSegment, route, segments);
|
const childConfig: Route[] = getChildConfig(route);
|
||||||
const rawSlicedSegments = segments.slice(lastChild);
|
|
||||||
const childConfig = getChildConfig(route);
|
|
||||||
|
|
||||||
const {segmentGroup, slicedSegments} =
|
const {segmentGroup, slicedSegments} =
|
||||||
split(rawSegment, consumedSegments, rawSlicedSegments, childConfig);
|
split(rawSegment, consumedSegments, rawSlicedSegments, childConfig);
|
||||||
|
|
||||||
const snapshot = new ActivatedRouteSnapshot(
|
|
||||||
consumedSegments, parameters, Object.freeze(this.urlTree.queryParams),
|
|
||||||
this.urlTree.fragment !, getData(route), outlet, route.component !, route,
|
|
||||||
getSourceSegmentGroup(rawSegment), getPathIndexShift(rawSegment) + consumedSegments.length,
|
|
||||||
getResolve(route));
|
|
||||||
|
|
||||||
|
|
||||||
if (slicedSegments.length === 0 && segmentGroup.hasChildren()) {
|
if (slicedSegments.length === 0 && segmentGroup.hasChildren()) {
|
||||||
const children = this.processChildren(childConfig, segmentGroup);
|
const children = this.processChildren(childConfig, segmentGroup);
|
||||||
return [new TreeNode<ActivatedRouteSnapshot>(snapshot, children)];
|
return [new TreeNode<ActivatedRouteSnapshot>(snapshot, children)];
|
||||||
|
@ -168,7 +172,13 @@ function getChildConfig(route: Route): Route[] {
|
||||||
return [];
|
return [];
|
||||||
}
|
}
|
||||||
|
|
||||||
function match(segmentGroup: UrlSegmentGroup, route: Route, segments: UrlSegment[]) {
|
interface MatchResult {
|
||||||
|
consumedSegments: UrlSegment[];
|
||||||
|
lastChild: number;
|
||||||
|
parameters: any;
|
||||||
|
}
|
||||||
|
|
||||||
|
function match(segmentGroup: UrlSegmentGroup, route: Route, segments: UrlSegment[]): MatchResult {
|
||||||
if (route.path === '') {
|
if (route.path === '') {
|
||||||
if (route.pathMatch === 'full' && (segmentGroup.hasChildren() || segments.length > 0)) {
|
if (route.pathMatch === 'full' && (segmentGroup.hasChildren() || segments.length > 0)) {
|
||||||
throw new NoMatch();
|
throw new NoMatch();
|
||||||
|
|
|
@ -3470,10 +3470,10 @@ describe('Integration', () => {
|
||||||
declarations: [LazyLoadedComponent],
|
declarations: [LazyLoadedComponent],
|
||||||
imports: [RouterModule.forChild([{path: '', component: LazyLoadedComponent}])],
|
imports: [RouterModule.forChild([{path: '', component: LazyLoadedComponent}])],
|
||||||
})
|
})
|
||||||
class LoadedModule {
|
class LazyLoadedModule {
|
||||||
}
|
}
|
||||||
|
|
||||||
loader.stubbedModules = {lazy: LoadedModule};
|
loader.stubbedModules = {lazy: LazyLoadedModule};
|
||||||
const fixture = createRoot(router, RootCmp);
|
const fixture = createRoot(router, RootCmp);
|
||||||
|
|
||||||
router.resetConfig([{path: '**', loadChildren: 'lazy'}]);
|
router.resetConfig([{path: '**', loadChildren: 'lazy'}]);
|
||||||
|
@ -3482,6 +3482,7 @@ describe('Integration', () => {
|
||||||
advance(fixture);
|
advance(fixture);
|
||||||
|
|
||||||
expect(location.path()).toEqual('/lazy');
|
expect(location.path()).toEqual('/lazy');
|
||||||
|
expect(fixture.nativeElement).toHaveText('lazy-loaded');
|
||||||
})));
|
})));
|
||||||
|
|
||||||
describe('preloading', () => {
|
describe('preloading', () => {
|
||||||
|
|
Loading…
Reference in New Issue