fix(router): do not update primary route if only secondary outlet is given (#11797)
This commit is contained in:
parent
b44b6ef8f5
commit
da5fc696bb
|
@ -182,6 +182,7 @@ function createPositionApplyingDoubleDots(
|
||||||
}
|
}
|
||||||
|
|
||||||
function getPath(command: any): any {
|
function getPath(command: any): any {
|
||||||
|
if (typeof command === 'object' && command.outlets) return command.outlets[PRIMARY_OUTLET];
|
||||||
return `${command}`;
|
return `${command}`;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -201,9 +202,13 @@ function updateSegmentGroup(
|
||||||
}
|
}
|
||||||
|
|
||||||
const m = prefixedWith(segmentGroup, startIndex, commands);
|
const m = prefixedWith(segmentGroup, startIndex, commands);
|
||||||
const slicedCommands = commands.slice(m.lastIndex);
|
const slicedCommands = commands.slice(m.commandIndex);
|
||||||
|
if (m.match && m.pathIndex < segmentGroup.segments.length) {
|
||||||
if (m.match && slicedCommands.length === 0) {
|
var g = new UrlSegmentGroup(segmentGroup.segments.slice(0, m.pathIndex), {});
|
||||||
|
g.children[PRIMARY_OUTLET] =
|
||||||
|
new UrlSegmentGroup(segmentGroup.segments.slice(m.pathIndex), segmentGroup.children);
|
||||||
|
return updateSegmentGroupChildren(g, 0, slicedCommands);
|
||||||
|
} else if (m.match && slicedCommands.length === 0) {
|
||||||
return new UrlSegmentGroup(segmentGroup.segments, {});
|
return new UrlSegmentGroup(segmentGroup.segments, {});
|
||||||
} else if (m.match && !segmentGroup.hasChildren()) {
|
} else if (m.match && !segmentGroup.hasChildren()) {
|
||||||
return createNewSegmentGroup(segmentGroup, startIndex, commands);
|
return createNewSegmentGroup(segmentGroup, startIndex, commands);
|
||||||
|
@ -241,7 +246,7 @@ function prefixedWith(segmentGroup: UrlSegmentGroup, startIndex: number, command
|
||||||
let currentCommandIndex = 0;
|
let currentCommandIndex = 0;
|
||||||
let currentPathIndex = startIndex;
|
let currentPathIndex = startIndex;
|
||||||
|
|
||||||
const noMatch = {match: false, lastIndex: 0};
|
const noMatch = {match: false, pathIndex: 0, commandIndex: 0};
|
||||||
while (currentPathIndex < segmentGroup.segments.length) {
|
while (currentPathIndex < segmentGroup.segments.length) {
|
||||||
if (currentCommandIndex >= commands.length) return noMatch;
|
if (currentCommandIndex >= commands.length) return noMatch;
|
||||||
const path = segmentGroup.segments[currentPathIndex];
|
const path = segmentGroup.segments[currentPathIndex];
|
||||||
|
@ -249,6 +254,8 @@ function prefixedWith(segmentGroup: UrlSegmentGroup, startIndex: number, command
|
||||||
const next =
|
const next =
|
||||||
currentCommandIndex < commands.length - 1 ? commands[currentCommandIndex + 1] : null;
|
currentCommandIndex < commands.length - 1 ? commands[currentCommandIndex + 1] : null;
|
||||||
|
|
||||||
|
if (currentPathIndex > 0 && curr === undefined) break;
|
||||||
|
|
||||||
if (curr && next && (typeof next === 'object') && next.outlets === undefined) {
|
if (curr && next && (typeof next === 'object') && next.outlets === undefined) {
|
||||||
if (!compare(curr, next, path)) return noMatch;
|
if (!compare(curr, next, path)) return noMatch;
|
||||||
currentCommandIndex += 2;
|
currentCommandIndex += 2;
|
||||||
|
@ -259,7 +266,7 @@ function prefixedWith(segmentGroup: UrlSegmentGroup, startIndex: number, command
|
||||||
currentPathIndex++;
|
currentPathIndex++;
|
||||||
}
|
}
|
||||||
|
|
||||||
return {match: true, lastIndex: currentCommandIndex};
|
return {match: true, pathIndex: currentPathIndex, commandIndex: currentCommandIndex};
|
||||||
}
|
}
|
||||||
|
|
||||||
function createNewSegmentGroup(
|
function createNewSegmentGroup(
|
||||||
|
|
|
@ -264,6 +264,27 @@ describe('Integration', () => {
|
||||||
expect(fixture.nativeElement).toHaveText('team 22 [ user victor, right: simple ]');
|
expect(fixture.nativeElement).toHaveText('team 22 [ user victor, right: simple ]');
|
||||||
})));
|
})));
|
||||||
|
|
||||||
|
it('should support secondary routes in seperate commands',
|
||||||
|
fakeAsync(inject([Router], (router: Router) => {
|
||||||
|
const fixture = createRoot(router, RootCmp);
|
||||||
|
|
||||||
|
router.resetConfig([{
|
||||||
|
path: 'team/:id',
|
||||||
|
component: TeamCmp,
|
||||||
|
children: [
|
||||||
|
{path: 'user/:name', component: UserCmp},
|
||||||
|
{path: 'simple', component: SimpleCmp, outlet: 'right'}
|
||||||
|
]
|
||||||
|
}]);
|
||||||
|
|
||||||
|
router.navigateByUrl('/team/22/user/victor');
|
||||||
|
advance(fixture);
|
||||||
|
router.navigate(['team/22', {outlets: {right: 'simple'}}]);
|
||||||
|
advance(fixture);
|
||||||
|
|
||||||
|
expect(fixture.nativeElement).toHaveText('team 22 [ user victor, right: simple ]');
|
||||||
|
})));
|
||||||
|
|
||||||
it('should deactivate outlets', fakeAsync(inject([Router], (router: Router) => {
|
it('should deactivate outlets', fakeAsync(inject([Router], (router: Router) => {
|
||||||
const fixture = createRoot(router, RootCmp);
|
const fixture = createRoot(router, RootCmp);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue