fix(router): redirect should not add unnecessary brackets

This commit is contained in:
vsavkin 2016-06-29 15:26:04 -07:00
parent f208ee0d57
commit 5781b96490
4 changed files with 25 additions and 7 deletions

View File

@ -12,6 +12,9 @@ import {RouterOutlet} from './src/directives/router_outlet';
export {ExtraOptions} from './src/common_router_providers';
export {Data, ResolveData, Route, RouterConfig} from './src/config';
export {RouterLink, RouterLinkWithHref} from './src/directives/router_link';
export {RouterLinkActive} from './src/directives/router_link_active';
export {RouterOutlet} from './src/directives/router_outlet';
export {CanActivate, CanDeactivate, Resolve} from './src/interfaces';
export {Event, NavigationCancel, NavigationEnd, NavigationError, NavigationStart, Router, RoutesRecognized} from './src/router';
export {RouterOutletMap} from './src/router_outlet_map';
@ -19,9 +22,7 @@ export {provideRouter} from './src/router_providers';
export {ActivatedRoute, ActivatedRouteSnapshot, RouterState, RouterStateSnapshot} from './src/router_state';
export {PRIMARY_OUTLET, Params} from './src/shared';
export {DefaultUrlSerializer, UrlPathWithParams, UrlSerializer, UrlTree} from './src/url_tree';
export {RouterLink, RouterLinkWithHref} from './src/directives/router_link';
export {RouterLinkActive} from './src/directives/router_link_active';
export {RouterOutlet} from './src/directives/router_outlet';
/**

View File

@ -235,19 +235,28 @@ function split(
const s = new UrlSegment(
consumedPaths,
createChildrenForEmptyPaths(config, new UrlSegment(slicedPath, segment.children)));
return {segment: s, slicedPath: []};
return {segment: mergeTrivialChildren(s), slicedPath: []};
} else if (slicedPath.length === 0 && containsEmptyPathRedirects(segment, slicedPath, config)) {
const s = new UrlSegment(
segment.pathsWithParams,
addEmptyPathsToChildrenIfNeeded(segment, slicedPath, config, segment.children));
return {segment: s, slicedPath};
return {segment: mergeTrivialChildren(s), slicedPath};
} else {
return {segment, slicedPath};
}
}
function mergeTrivialChildren(s: UrlSegment): UrlSegment {
if (s.numberOfChildren === 1 && s.children[PRIMARY_OUTLET]) {
const c = s.children[PRIMARY_OUTLET];
return new UrlSegment(s.pathsWithParams.concat(c.pathsWithParams), c.children);
} else {
return s;
}
}
function addEmptyPathsToChildrenIfNeeded(
segment: UrlSegment, slicedPath: UrlPathWithParams[], routes: Route[],
children: {[name: string]: UrlSegment}): {[name: string]: UrlSegment} {

View File

@ -96,7 +96,15 @@ export class UrlSegment {
forEach(children, (v: any, k: any) => v.parent = this);
}
hasChildren(): boolean { return Object.keys(this.children).length > 0; }
/**
* Return true if the segment has child segments
*/
hasChildren(): boolean { return this.numberOfChildren > 0; }
/**
* Returns the number of child sements.
*/
get numberOfChildren(): number { return Object.keys(this.children).length; }
toString(): string { return serializePaths(this); }
}

View File

@ -187,7 +187,7 @@ describe('applyRedirects', () => {
},
{path: '', redirectTo: 'a'}
],
'', (t: UrlTree) => { compareTrees(t, tree('a/(b)')); });
'', (t: UrlTree) => { compareTrees(t, tree('a/b')); });
});
it('redirect to an empty path should work', () => {