fix(router): handle new navigations from a NavigationEnd event (#41262) (#41511)

This commit removes the line to set `currentNavigation` to `null` in the
navigation transitions subscription of the router. This logic is
already handled in the `finalize` stage of the transition pipe and has
been found to cause issues if a new navigation is triggered from a
subscription to the `NavigationEnd` event.

fixes #37460

PR Close #41262

PR Close #41511
This commit is contained in:
Andrew Scott
2021-03-18 09:10:22 -07:00
committed by Zach Arend
parent 74d1769a48
commit e34299af25
2 changed files with 35 additions and 4 deletions
-1
View File
@@ -1245,7 +1245,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 => {
+35 -3
View File
@@ -19,6 +19,10 @@ describe('bootstrap', () => {
let log: any[] = [];
let testProviders: any[] = null!;
@Component({template: 'simple'})
class SimpleCmp {
}
@Component({selector: 'test-app', template: 'root <router-outlet></router-outlet>'})
class RootCmp {
constructor() {
@@ -369,7 +373,35 @@ describe('bootstrap', () => {
done();
});
function waitForNavigationToComplete(router: Router): Promise<any> {
return router.events.pipe(filter((e: any) => e instanceof NavigationEnd), first()).toPromise();
}
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');
});
});