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,