fix(router): handle new navigations from a NavigationEnd event (#41262)
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
This commit is contained in:
parent
deacc741e0
commit
44a7fae00f
@ -1293,7 +1293,6 @@ export class Router {
|
|||||||
.next(new NavigationEnd(
|
.next(new NavigationEnd(
|
||||||
t.id, this.serializeUrl(t.extractedUrl), this.serializeUrl(this.currentUrlTree)));
|
t.id, this.serializeUrl(t.extractedUrl), this.serializeUrl(this.currentUrlTree)));
|
||||||
this.lastSuccessfulNavigation = this.currentNavigation;
|
this.lastSuccessfulNavigation = this.currentNavigation;
|
||||||
this.currentNavigation = null;
|
|
||||||
t.resolve(true);
|
t.resolve(true);
|
||||||
},
|
},
|
||||||
e => {
|
e => {
|
||||||
|
@ -18,6 +18,10 @@ describe('bootstrap', () => {
|
|||||||
let log: any[] = [];
|
let log: any[] = [];
|
||||||
let testProviders: any[] = null!;
|
let testProviders: any[] = null!;
|
||||||
|
|
||||||
|
@Component({template: 'simple'})
|
||||||
|
class SimpleCmp {
|
||||||
|
}
|
||||||
|
|
||||||
@Component({selector: 'test-app', template: 'root <router-outlet></router-outlet>'})
|
@Component({selector: 'test-app', template: 'root <router-outlet></router-outlet>'})
|
||||||
class RootCmp {
|
class RootCmp {
|
||||||
constructor() {
|
constructor() {
|
||||||
@ -394,4 +398,36 @@ describe('bootstrap', () => {
|
|||||||
expect(window.removeEventListener).toHaveBeenCalledWith('popstate', jasmine.any(Function));
|
expect(window.removeEventListener).toHaveBeenCalledWith('popstate', jasmine.any(Function));
|
||||||
expect(window.removeEventListener).toHaveBeenCalledWith('hashchange', 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');
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
Loading…
x
Reference in New Issue
Block a user