mirror of
https://github.com/angular/angular.git
synced 2026-09-14 13:54:52 +08:00
fix(router): Ensure renavigating in component init works with enabledBlocking (#48066)
The way to complete the `Subject` in a way that is able to be read on the subject properties itself is to call `unsubscribe`: https://github.com/ReactiveX/rxjs/blob/afac3d574323333572987e043adcd0f8d4cff546/src/internal/Subject.ts#L101-L104 This sets the `closed` property to `true` whereas `complete` does not. fixes #48052 PR Close #48066
This commit is contained in:
committed by
Jessica Janiuk
parent
11809badb2
commit
aef353c143
@@ -184,8 +184,10 @@ export function getBootstrapListener() {
|
||||
injector.get(ROUTER_PRELOADER, null, InjectFlags.Optional)?.setUpPreloading();
|
||||
injector.get(ROUTER_SCROLLER, null, InjectFlags.Optional)?.init();
|
||||
router.resetRootComponentType(ref.componentTypes[0]);
|
||||
bootstrapDone.next();
|
||||
bootstrapDone.complete();
|
||||
if (!bootstrapDone.closed) {
|
||||
bootstrapDone.next();
|
||||
bootstrapDone.unsubscribe();
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@@ -11,7 +11,7 @@ import {ApplicationRef, Component, CUSTOM_ELEMENTS_SCHEMA, destroyPlatform, Inje
|
||||
import {inject} from '@angular/core/testing';
|
||||
import {BrowserModule} from '@angular/platform-browser';
|
||||
import {platformBrowserDynamic} from '@angular/platform-browser-dynamic';
|
||||
import {NavigationEnd, provideRouter, Resolve, Router, RouterModule, withEnabledBlockingInitialNavigation} from '@angular/router';
|
||||
import {NavigationEnd, provideRouter, Resolve, Router, RouterModule, RouterOutlet, withEnabledBlockingInitialNavigation} from '@angular/router';
|
||||
|
||||
// This is needed, because all files under `packages/` are compiled together as part of the
|
||||
// [legacy-unit-tests-saucelabs][1] CI job, including the `lib.webworker.d.ts` typings brought in by
|
||||
@@ -112,6 +112,55 @@ describe('bootstrap', () => {
|
||||
});
|
||||
});
|
||||
|
||||
it('should finish navigation when initial navigation is enabledBlocking and component renavigates on render',
|
||||
async () => {
|
||||
@Component({
|
||||
template: '',
|
||||
standalone: true,
|
||||
})
|
||||
class Renavigate {
|
||||
constructor(router: Router) {
|
||||
router.navigateByUrl('/other');
|
||||
}
|
||||
}
|
||||
@Component({
|
||||
template: '',
|
||||
standalone: true,
|
||||
})
|
||||
class BlankCmp {
|
||||
}
|
||||
|
||||
let resolveFn: () => void;
|
||||
const navigationEndPromise = new Promise<void>(r => {
|
||||
resolveFn = r;
|
||||
});
|
||||
|
||||
@NgModule({
|
||||
imports: [BrowserModule, RouterOutlet],
|
||||
declarations: [RootCmp],
|
||||
bootstrap: [RootCmp],
|
||||
providers: [
|
||||
{provide: LocationStrategy, useClass: HashLocationStrategy},
|
||||
provideRouter(
|
||||
[{path: '', component: Renavigate}, {path: 'other', component: BlankCmp}],
|
||||
withEnabledBlockingInitialNavigation())
|
||||
],
|
||||
})
|
||||
class TestModule {
|
||||
constructor(router: Router) {
|
||||
router.events.subscribe(e => {
|
||||
if (e instanceof NavigationEnd) {
|
||||
resolveFn();
|
||||
expect(router.url).toEqual('/other');
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
await Promise.all(
|
||||
[platformBrowserDynamic([]).bootstrapModule(TestModule), navigationEndPromise]);
|
||||
});
|
||||
|
||||
it('should wait for redirect when initialNavigation = enabledBlocking', async () => {
|
||||
@Injectable({providedIn: 'root'})
|
||||
class Redirect {
|
||||
|
||||
Reference in New Issue
Block a user