fix(router): handle when both primary and secondary are empty-path and primary has a child

This commit is contained in:
vsavkin 2016-07-22 18:32:26 -07:00
parent 06e4ca4bb3
commit 2b63330a36
6 changed files with 38 additions and 6 deletions

View File

@ -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([], {});
} }
} }

View File

@ -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)`.
* *

View File

@ -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;

View File

@ -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> {

View File

@ -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}]}],

View File

@ -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(
[{ [{