fix(router): handle when both primary and secondary are empty-path and primary has a child
This commit is contained in:
parent
06e4ca4bb3
commit
2b63330a36
|
@ -342,7 +342,7 @@ function createChildrenForEmptyPaths(
|
||||||
const res: {[name: string]: UrlSegment} = {};
|
const res: {[name: string]: UrlSegment} = {};
|
||||||
res[PRIMARY_OUTLET] = primarySegment;
|
res[PRIMARY_OUTLET] = primarySegment;
|
||||||
for (let r of routes) {
|
for (let r of routes) {
|
||||||
if (r.path === '') {
|
if (r.path === '' && getOutlet(r) !== PRIMARY_OUTLET) {
|
||||||
res[getOutlet(r)] = new UrlSegment([], {});
|
res[getOutlet(r)] = new UrlSegment([], {});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -60,7 +60,7 @@ import {UrlTree} from '../url_tree';
|
||||||
component</a>
|
component</a>
|
||||||
* ```
|
* ```
|
||||||
*
|
*
|
||||||
* The router link directive always treats it the provided input as a delta to the current url.
|
* The router link directive always treats the provided input as a delta to the current url.
|
||||||
*
|
*
|
||||||
* For instance, if the current url is `/user/(box//aux:team)`.
|
* For instance, if the current url is `/user/(box//aux:team)`.
|
||||||
*
|
*
|
||||||
|
|
|
@ -128,8 +128,6 @@ function processPathsWithParamsAgainstRoute(
|
||||||
const childConfig = getChildConfig(route);
|
const childConfig = getChildConfig(route);
|
||||||
|
|
||||||
const {segment, slicedPath} = split(rawSegment, consumedPaths, rawSlicedPath, childConfig);
|
const {segment, slicedPath} = split(rawSegment, consumedPaths, rawSlicedPath, childConfig);
|
||||||
// console.log("raw", rawSegment)
|
|
||||||
// console.log(segment.toString(), childConfig)
|
|
||||||
|
|
||||||
const snapshot = new ActivatedRouteSnapshot(
|
const snapshot = new ActivatedRouteSnapshot(
|
||||||
consumedPaths, Object.freeze(merge(inherited.allParams, parameters)),
|
consumedPaths, Object.freeze(merge(inherited.allParams, parameters)),
|
||||||
|
@ -292,7 +290,7 @@ function createChildrenForEmptyPaths(
|
||||||
primarySegment._pathIndexShift = consumedPaths.length;
|
primarySegment._pathIndexShift = consumedPaths.length;
|
||||||
|
|
||||||
for (let r of routes) {
|
for (let r of routes) {
|
||||||
if (r.path === '') {
|
if (r.path === '' && getOutlet(r) !== PRIMARY_OUTLET) {
|
||||||
const s = new UrlSegment([], {});
|
const s = new UrlSegment([], {});
|
||||||
s._sourceSegment = segment;
|
s._sourceSegment = segment;
|
||||||
s._pathIndexShift = consumedPaths.length;
|
s._pathIndexShift = consumedPaths.length;
|
||||||
|
|
|
@ -289,7 +289,7 @@ export class Router {
|
||||||
* router.navigate(['team', 33, 'team', '11], {relativeTo: route});
|
* router.navigate(['team', 33, 'team', '11], {relativeTo: route});
|
||||||
* ```
|
* ```
|
||||||
*
|
*
|
||||||
* In opposite to `navigateByUrl`, `navigate` always takes a detla
|
* In opposite to `navigateByUrl`, `navigate` always takes a delta
|
||||||
* that is applied to the current URL.
|
* that is applied to the current URL.
|
||||||
*/
|
*/
|
||||||
navigate(commands: any[], extras: NavigationExtras = {}): Promise<boolean> {
|
navigate(commands: any[], extras: NavigationExtras = {}): Promise<boolean> {
|
||||||
|
|
|
@ -15,6 +15,7 @@ import {LoadedRouterConfig} from '../src/router_config_loader';
|
||||||
import {DefaultUrlSerializer, UrlSegment, UrlTree, equalPathsWithParams} from '../src/url_tree';
|
import {DefaultUrlSerializer, UrlSegment, UrlTree, equalPathsWithParams} from '../src/url_tree';
|
||||||
|
|
||||||
describe('applyRedirects', () => {
|
describe('applyRedirects', () => {
|
||||||
|
|
||||||
it('should return the same url tree when no redirects', () => {
|
it('should return the same url tree when no redirects', () => {
|
||||||
checkRedirect(
|
checkRedirect(
|
||||||
[{path: 'a', component: ComponentA, children: [{path: 'b', component: ComponentB}]}],
|
[{path: 'a', component: ComponentA, children: [{path: 'b', component: ComponentB}]}],
|
||||||
|
|
|
@ -339,6 +339,39 @@ describe('recognize', () => {
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('should match (non-termianl) when both primary and secondary and primary has a child',
|
||||||
|
() => {
|
||||||
|
const config = [{
|
||||||
|
path: 'parent',
|
||||||
|
children: [
|
||||||
|
{
|
||||||
|
path: '',
|
||||||
|
component: ComponentA,
|
||||||
|
children: [
|
||||||
|
{path: 'b', component: ComponentB},
|
||||||
|
{path: 'c', component: ComponentC},
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
path: '',
|
||||||
|
component: ComponentD,
|
||||||
|
outlet: 'secondary',
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}];
|
||||||
|
|
||||||
|
checkRecognize(config, 'parent/b', (s: RouterStateSnapshot) => {
|
||||||
|
checkActivatedRoute(s.root, '', {}, RootComponent);
|
||||||
|
checkActivatedRoute(s.firstChild(s.root), 'parent', {}, undefined);
|
||||||
|
|
||||||
|
const cc = s.children(s.firstChild(s.root));
|
||||||
|
checkActivatedRoute(cc[0], '', {}, ComponentA);
|
||||||
|
checkActivatedRoute(cc[1], '', {}, ComponentD, 'secondary');
|
||||||
|
|
||||||
|
checkActivatedRoute(s.firstChild(cc[0]), 'b', {}, ComponentB);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
it('should match (terminal)', () => {
|
it('should match (terminal)', () => {
|
||||||
checkRecognize(
|
checkRecognize(
|
||||||
[{
|
[{
|
||||||
|
|
Loading…
Reference in New Issue