fix(router): lazy loading keeps refetching modules (#10707)

This commit is contained in:
Victor Savkin 2016-08-11 22:59:53 -07:00 committed by vikerman
parent f48142e679
commit cc6749c158
3 changed files with 42 additions and 8 deletions

View File

@ -244,10 +244,14 @@ class ApplyRedirects {
} else if (route.loadChildren) {
return runGuards(injector, route).mergeMap(shouldLoad => {
if (shouldLoad) {
return this.configLoader.load(injector, route.loadChildren).map(r => {
(<any>route)._loadedConfig = r;
return r;
});
if ((<any>route)._loadedConfig) {
return of ((<any>route)._loadedConfig);
} else {
return this.configLoader.load(injector, route.loadChildren).map(r => {
(<any>route)._loadedConfig = r;
return r;
});
}
} else {
return canLoadFails(route);
}

View File

@ -406,7 +406,6 @@ export class Router {
})
.forEach((shouldActivate: boolean) => {
if (!shouldActivate || id !== this.navigationId) {
this.routerEvents.next(new NavigationCancel(id, this.serializeUrl(url)));
navigationIsSuccessful = false;
return;
}
@ -429,9 +428,14 @@ export class Router {
.then(
() => {
this.navigated = true;
this.routerEvents.next(
new NavigationEnd(id, this.serializeUrl(url), this.serializeUrl(appliedUrl)));
resolvePromise(navigationIsSuccessful);
if (navigationIsSuccessful) {
this.routerEvents.next(
new NavigationEnd(id, this.serializeUrl(url), this.serializeUrl(appliedUrl)));
resolvePromise(true);
} else {
this.routerEvents.next(new NavigationCancel(id, this.serializeUrl(url)));
resolvePromise(false);
}
},
e => {
this.currentRouterState = storedState;

View File

@ -266,6 +266,32 @@ describe('applyRedirects', () => {
expect((<any>config[1])._loadedConfig).toBe(loadedConfig);
});
});
it('should load the configuration only once', () => {
const loadedConfig = new LoadedRouterConfig(
[{path: '', component: ComponentB}], <any>'stubInjector', <any>'stubFactoryResolver');
let called = false;
const loader = {
load: (injector: any, p: any) => {
if (called) throw new Error('Should not be called twice');
called = true;
return of (loadedConfig);
}
};
const config = [{path: 'a', loadChildren: 'children'}];
applyRedirects(<any>'providedInjector', <any>loader, tree('a?k1'), config).subscribe(r => {});
applyRedirects(<any>'providedInjector', <any>loader, tree('a?k2'), config)
.subscribe(
r => {
compareTrees(r, tree('a'));
expect((<any>config[0])._loadedConfig).toBe(loadedConfig);
},
(e) => { throw 'Should not reach'; });
});
});
describe('empty paths', () => {