diff --git a/modules/@angular/router/src/resolve.ts b/modules/@angular/router/src/resolve.ts index 955bec6009..24f35578c9 100644 --- a/modules/@angular/router/src/resolve.ts +++ b/modules/@angular/router/src/resolve.ts @@ -17,17 +17,25 @@ export function resolve( function resolveNode( resolver: ComponentResolver, node: TreeNode): Observable { if (node.children.length === 0) { - return fromPromise(resolver.resolveComponent(node.value.component).then(factory => { + return fromPromise(resolveComponent(resolver, node.value).then(factory => { node.value._resolvedComponentFactory = factory; return node.value; })); } else { const c = node.children.map(c => resolveNode(resolver, c).toPromise()); - return forkJoin(c).map( - _ => resolver.resolveComponent(node.value.component).then(factory => { - node.value._resolvedComponentFactory = factory; - return node.value; - })); + return forkJoin(c).map(_ => resolveComponent(resolver, node.value).then(factory => { + node.value._resolvedComponentFactory = factory; + return node.value; + })); + } +} + +function resolveComponent( + resolver: ComponentResolver, snapshot: ActivatedRouteSnapshot): Promise { + if (snapshot.component && snapshot._routeConfig) { + return resolver.resolveComponent(snapshot.component); + } else { + return Promise.resolve(null); } } \ No newline at end of file diff --git a/modules/@angular/router/test/resolve.spec.ts b/modules/@angular/router/test/resolve.spec.ts new file mode 100644 index 0000000000..2237bb60a2 --- /dev/null +++ b/modules/@angular/router/test/resolve.spec.ts @@ -0,0 +1,49 @@ +import {DefaultUrlSerializer} from '../src/url_serializer'; +import {UrlTree, UrlSegment} from '../src/url_tree'; +import {RouterStateSnapshot} from '../src/router_state'; +import {recognize} from '../src/recognize'; +import {resolve} from '../src/resolve'; +import {RouterConfig} from '../src/config'; + +describe('resolve', () => { + it('should resolve components', () => { + checkResolve([ + {path: 'a', component: "ComponentA"} + ], "a", {ComponentA: 'ResolvedComponentA'}, (resolved:RouterStateSnapshot) => { + expect(resolved.firstChild(resolved.root)._resolvedComponentFactory).toEqual('ResolvedComponentA'); + }); + }); + + it('should not resolve componentless routes', () => { + checkResolve([ + {path: 'a', children: []} + ], "a", {}, (resolved:RouterStateSnapshot) => { + expect(resolved.firstChild(resolved.root)._resolvedComponentFactory).toEqual(null); + }); + }); +}); + +function checkResolve(config: RouterConfig, url: string, resolved: {[k:string]:string}, callback: any): void { + const resolver = { + resolveComponent: (component:string):Promise => { + if (resolved[component]) { + return Promise.resolve(resolved[component]); + } else { + return Promise.reject("unknown component"); + } + } + }; + + recognize(RootComponent, config, tree(url), url).mergeMap(s => resolve(resolver, s)).subscribe(callback, e => { + throw e; + }); +} + +function tree(url: string): UrlTree { + return new DefaultUrlSerializer().parse(url); +} + +class RootComponent {} +class ComponentA {} +class ComponentB {} +class ComponentC {}