From 47d41d492b650f6056926defdec08f62eb8dcd88 Mon Sep 17 00:00:00 2001 From: Dzmitry Shylovich Date: Sun, 15 Jan 2017 01:05:24 +0300 Subject: [PATCH] fix(router): fix navigation from the root component ngOnInit hook (#13932) Closes #13795 PR Close #13932 --- modules/@angular/router/src/router.ts | 4 +++- .../@angular/router/test/integration.spec.ts | 21 +++++++++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/modules/@angular/router/src/router.ts b/modules/@angular/router/src/router.ts index 01b7192d75..b04e837981 100644 --- a/modules/@angular/router/src/router.ts +++ b/modules/@angular/router/src/router.ts @@ -364,7 +364,9 @@ export class Router { */ initialNavigation(): void { this.setUpLocationChangeListener(); - this.navigateByUrl(this.location.path(true), {replaceUrl: true}); + if (this.navigationId === 0) { + this.navigateByUrl(this.location.path(true), {replaceUrl: true}); + } } /** diff --git a/modules/@angular/router/test/integration.spec.ts b/modules/@angular/router/test/integration.spec.ts index 596e177e61..53642f5852 100644 --- a/modules/@angular/router/test/integration.spec.ts +++ b/modules/@angular/router/test/integration.spec.ts @@ -37,6 +37,18 @@ describe('Integration', () => { expect(location.path()).toEqual('/simple'); }))); + it('should navigate from ngOnInit hook', + fakeAsync(inject([Router, Location], (router: Router, location: Location) => { + router.resetConfig([ + {path: '', component: SimpleCmp}, + {path: 'one', component: RouteCmp}, + ]); + + const fixture = createRoot(router, RootCmpWithOnInit); + expect(location.path()).toEqual('/one'); + expect(fixture.nativeElement).toHaveText('route'); + }))); + describe('should execute navigations serially', () => { let log: any[] = []; @@ -2932,6 +2944,13 @@ class ComponentRecordingRoutePathAndUrl { class RootCmp { } +@Component({selector: 'root-cmp-on-init', template: ``}) +class RootCmpWithOnInit { + constructor(private router: Router) {} + + ngOnInit(): void { this.router.navigate(['one']); } +} + @Component({ selector: 'root-cmp', template: @@ -3003,6 +3022,7 @@ function createRoot(router: Router, type: any): ComponentFixture { ComponentRecordingRoutePathAndUrl, RouteCmp, RootCmp, + RootCmpWithOnInit, RelativeLinkInIfCmp, RootCmpWithTwoOutlets, EmptyQueryParamsCmp, @@ -3030,6 +3050,7 @@ function createRoot(router: Router, type: any): ComponentFixture { ComponentRecordingRoutePathAndUrl, RouteCmp, RootCmp, + RootCmpWithOnInit, RelativeLinkInIfCmp, RootCmpWithTwoOutlets, EmptyQueryParamsCmp,