diff --git a/packages/router/src/router.ts b/packages/router/src/router.ts index 8c7a01f100..8fa4819b11 100644 --- a/packages/router/src/router.ts +++ b/packages/router/src/router.ts @@ -1293,7 +1293,6 @@ export class Router { .next(new NavigationEnd( t.id, this.serializeUrl(t.extractedUrl), this.serializeUrl(this.currentUrlTree))); this.lastSuccessfulNavigation = this.currentNavigation; - this.currentNavigation = null; t.resolve(true); }, e => { diff --git a/packages/router/test/bootstrap.spec.ts b/packages/router/test/bootstrap.spec.ts index e3b9a63915..5abe19e4a7 100644 --- a/packages/router/test/bootstrap.spec.ts +++ b/packages/router/test/bootstrap.spec.ts @@ -18,6 +18,10 @@ describe('bootstrap', () => { let log: any[] = []; let testProviders: any[] = null!; + @Component({template: 'simple'}) + class SimpleCmp { + } + @Component({selector: 'test-app', template: 'root '}) class RootCmp { constructor() { @@ -394,4 +398,36 @@ describe('bootstrap', () => { expect(window.removeEventListener).toHaveBeenCalledWith('popstate', jasmine.any(Function)); expect(window.removeEventListener).toHaveBeenCalledWith('hashchange', jasmine.any(Function)); }); + + it('can schedule a navigation from the NavigationEnd event #37460', async (done) => { + @NgModule({ + imports: [ + BrowserModule, + RouterModule.forRoot( + [ + {path: 'a', component: SimpleCmp}, + {path: 'b', component: SimpleCmp}, + ], + ) + ], + declarations: [RootCmp, SimpleCmp], + bootstrap: [RootCmp], + providers: [...testProviders], + }) + class TestModule { + } + + const res = await platformBrowserDynamic([]).bootstrapModule(TestModule); + const router = res.injector.get(Router); + router.events.subscribe(() => { + expect(router.getCurrentNavigation()?.id).toBeDefined(); + }); + router.events.subscribe(async (e) => { + if (e instanceof NavigationEnd && e.url === '/b') { + await router.navigate(['a']); + done(); + } + }); + await router.navigateByUrl('/b'); + }); });