diff --git a/modules/@angular/router/src/router.ts b/modules/@angular/router/src/router.ts index faeec8b136..f5da74f613 100644 --- a/modules/@angular/router/src/router.ts +++ b/modules/@angular/router/src/router.ts @@ -317,6 +317,17 @@ export class Router { this.currentRouterState = createEmptyState(this.currentUrlTree, this.rootComponentType); } + /** + * @internal + * TODO: this should be removed once the constructor of the router made internal + */ + resetRootComponentType(rootComponentType: Type): void { + this.rootComponentType = rootComponentType; + // TODO: vsavkin router 4.0 should make the root component set to null + // this will simplify the lifecycle of the router. + this.currentRouterState.root.component = this.rootComponentType; + } + /** * Sets up the location change listener and performs the initial navigation. */ diff --git a/modules/@angular/router/test/router.spec.ts b/modules/@angular/router/test/router.spec.ts index 42ea05b27b..007e6c9b7a 100644 --- a/modules/@angular/router/test/router.spec.ts +++ b/modules/@angular/router/test/router.spec.ts @@ -6,13 +6,31 @@ * found in the LICENSE file at https://angular.io/license */ -import {PreActivation} from '../src/router'; +import {TestBed} from '@angular/core/testing'; + +import {PreActivation, Router} from '../src/router'; import {RouterOutletMap} from '../src/router_outlet_map'; import {ActivatedRouteSnapshot, InheritedResolve, RouterStateSnapshot, createEmptyStateSnapshot} from '../src/router_state'; import {DefaultUrlSerializer} from '../src/url_tree'; import {TreeNode} from '../src/utils/tree'; +import {RouterTestingModule} from '../testing/router_testing_module'; describe('Router', () => { + describe('resetRootComponentType', () => { + class NewRootComponent {} + + beforeEach(() => { TestBed.configureTestingModule({imports: [RouterTestingModule]}); }); + + it('should not change root route when updating the root component', () => { + const r: Router = TestBed.get(Router); + const root = r.routerState.root; + + r.resetRootComponentType(NewRootComponent); + + expect(r.routerState.root).toBe(root); + }); + }); + describe('PreActivation', () => { const serializer = new DefaultUrlSerializer(); const inj = {get: (token: any) => () => `${token}_value`};