feat(router): allow async routes to be defined with "loader"

This commit is contained in:
Brian Ford 2015-10-08 12:27:55 -07:00
parent 6d4bd5d901
commit ee32b1bc37
2 changed files with 29 additions and 1 deletions

View File

@ -13,10 +13,13 @@ export function normalizeRouteConfig(config: RouteDefinition): RouteDefinition {
return <RouteDefinition>config; return <RouteDefinition>config;
} }
if ((!config.component) == (!config.redirectTo)) { if ((+!!config.component) + (+!!config.redirectTo) + (+!!config.loader) != 1) {
throw new BaseException( throw new BaseException(
`Route config should contain exactly one "component", "loader", or "redirectTo" property.`); `Route config should contain exactly one "component", "loader", or "redirectTo" property.`);
} }
if (config.loader) {
return new AsyncRoute({path: config.path, loader: config.loader, as: config.as});
}
if (config.component) { if (config.component) {
if (typeof config.component == 'object') { if (typeof config.component == 'object') {
let componentDefinitionObject = <ComponentDefinition>config.component; let componentDefinitionObject = <ComponentDefinition>config.component;

View File

@ -100,6 +100,22 @@ export function main() {
})); }));
it('should work in an app with async components defined with "loader"',
inject([AsyncTestCompleter], (async) => {
bootstrap(ConciseAsyncAppCmp,
[bind(ROUTER_PRIMARY_COMPONENT).toValue(AsyncAppCmp), testBindings])
.then((applicationRef) => {
var router = applicationRef.hostComponent.router;
router.subscribe((_) => {
expect(el).toHaveText('root { hello }');
expect(applicationRef.hostComponent.location.path()).toEqual('/hello');
async.done();
});
router.navigateByUrl('/hello');
});
}));
it('should work in an app with a constructor component', it('should work in an app with a constructor component',
inject([AsyncTestCompleter], (async) => { inject([AsyncTestCompleter], (async) => {
bootstrap( bootstrap(
@ -187,6 +203,15 @@ class AsyncAppCmp {
constructor(public router: Router, public location: LocationStrategy) {} constructor(public router: Router, public location: LocationStrategy) {}
} }
@Component({selector: 'app-cmp'})
@View({template: `root { <router-outlet></router-outlet> }`, directives: ROUTER_DIRECTIVES})
@RouteConfig([
{path: '/hello', loader: HelloLoader},
])
class ConciseAsyncAppCmp {
constructor(public router: Router, public location: LocationStrategy) {}
}
@Component({selector: 'app-cmp'}) @Component({selector: 'app-cmp'})
@View({template: `root { <router-outlet></router-outlet> }`, directives: ROUTER_DIRECTIVES}) @View({template: `root { <router-outlet></router-outlet> }`, directives: ROUTER_DIRECTIVES})
@RouteConfig([ @RouteConfig([