fix(router): throw a better error message when angular 1 is not bootstraped
This commit is contained in:
parent
25e5b2fdf0
commit
c767df0e4e
|
@ -7,7 +7,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import {Location} from '@angular/common';
|
import {Location} from '@angular/common';
|
||||||
import {TestBed} from '@angular/core/testing';
|
import {TestBed, inject} from '@angular/core/testing';
|
||||||
|
|
||||||
import {ResolveData} from '../src/config';
|
import {ResolveData} from '../src/config';
|
||||||
import {PreActivation, Router} from '../src/router';
|
import {PreActivation, Router} from '../src/router';
|
||||||
|
@ -36,23 +36,20 @@ describe('Router', () => {
|
||||||
describe('setUpLocationChangeListener', () => {
|
describe('setUpLocationChangeListener', () => {
|
||||||
beforeEach(() => { TestBed.configureTestingModule({imports: [RouterTestingModule]}); });
|
beforeEach(() => { TestBed.configureTestingModule({imports: [RouterTestingModule]}); });
|
||||||
|
|
||||||
it('should be indempotent', () => {
|
it('should be indempotent', inject([Router, Location], (r: Router, location: Location) => {
|
||||||
const r: Router = TestBed.get(Router);
|
r.setUpLocationChangeListener();
|
||||||
const location: Location = TestBed.get(Location);
|
const a = (<any>r).locationSubscription;
|
||||||
|
r.setUpLocationChangeListener();
|
||||||
|
const b = (<any>r).locationSubscription;
|
||||||
|
|
||||||
r.setUpLocationChangeListener();
|
expect(a).toBe(b);
|
||||||
const a = (<any>r).locationSubscription;
|
|
||||||
r.setUpLocationChangeListener();
|
|
||||||
const b = (<any>r).locationSubscription;
|
|
||||||
|
|
||||||
expect(a).toBe(b);
|
r.dispose();
|
||||||
|
r.setUpLocationChangeListener();
|
||||||
|
const c = (<any>r).locationSubscription;
|
||||||
|
|
||||||
r.dispose();
|
expect(c).not.toBe(b);
|
||||||
r.setUpLocationChangeListener();
|
}));
|
||||||
const c = (<any>r).locationSubscription;
|
|
||||||
|
|
||||||
expect(c).not.toBe(b);
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('PreActivation', () => {
|
describe('PreActivation', () => {
|
||||||
|
|
|
@ -40,10 +40,20 @@ export const RouterUpgradeInitializer = {
|
||||||
deps: [UpgradeModule, ApplicationRef, RouterPreloader, ROUTER_CONFIGURATION]
|
deps: [UpgradeModule, ApplicationRef, RouterPreloader, ROUTER_CONFIGURATION]
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @internal
|
||||||
|
*/
|
||||||
export function initialRouterNavigation(
|
export function initialRouterNavigation(
|
||||||
ngUpgrade: UpgradeModule, ref: ApplicationRef, preloader: RouterPreloader,
|
ngUpgrade: UpgradeModule, ref: ApplicationRef, preloader: RouterPreloader,
|
||||||
opts: ExtraOptions): Function {
|
opts: ExtraOptions): Function {
|
||||||
return () => {
|
return () => {
|
||||||
|
if (!ngUpgrade.$injector) {
|
||||||
|
throw new Error(`
|
||||||
|
RouterUpgradeInitializer can be used only after UpgradeModule.bootstrap has been called.
|
||||||
|
Remove RouterUpgradeInitializer and call setUpLocationSync after UpgradeModule.bootstrap.
|
||||||
|
`);
|
||||||
|
}
|
||||||
|
|
||||||
const router = ngUpgrade.injector.get(Router);
|
const router = ngUpgrade.injector.get(Router);
|
||||||
const ref = ngUpgrade.injector.get(ApplicationRef);
|
const ref = ngUpgrade.injector.get(ApplicationRef);
|
||||||
|
|
||||||
|
@ -52,17 +62,28 @@ export function initialRouterNavigation(
|
||||||
if (opts.initialNavigation === false) {
|
if (opts.initialNavigation === false) {
|
||||||
router.setUpLocationChangeListener();
|
router.setUpLocationChangeListener();
|
||||||
} else {
|
} else {
|
||||||
setTimeout(() => { router.initialNavigation(); }, 0);
|
router.initialNavigation();
|
||||||
}
|
}
|
||||||
|
|
||||||
// History.pushState does not fire onPopState, so the angular2 location
|
setUpLocationSync(ngUpgrade);
|
||||||
// doesn't detect it. The workaround is to attach a location change listener
|
|
||||||
// that will call navigate directly.
|
|
||||||
ngUpgrade.$injector.get('$rootScope')
|
|
||||||
.$on('$locationChangeStart', (_: any, next: string, __: string) => {
|
|
||||||
const url = document.createElement('a');
|
|
||||||
url.href = next;
|
|
||||||
router.navigateByUrl(url.pathname);
|
|
||||||
});
|
|
||||||
};
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @whatItDoes Sets up a location synchronization.
|
||||||
|
*
|
||||||
|
* History.pushState does not fire onPopState, so the angular2 location
|
||||||
|
* doesn't detect it. The workaround is to attach a location change listener
|
||||||
|
*
|
||||||
|
* @experimental
|
||||||
|
*/
|
||||||
|
export function setUpLocationSync(ngUpgrade: UpgradeModule): void {
|
||||||
|
const router: Router = ngUpgrade.injector.get(Router);
|
||||||
|
const url = document.createElement('a');
|
||||||
|
|
||||||
|
ngUpgrade.$injector.get('$rootScope')
|
||||||
|
.$on('$locationChangeStart', (_: any, next: string, __: string) => {
|
||||||
|
url.href = next;
|
||||||
|
router.navigateByUrl(url.pathname);
|
||||||
|
});
|
||||||
}
|
}
|
Loading…
Reference in New Issue