fix(router): make setUpLocationChangeListener idempotent
This commit is contained in:
@ -382,23 +382,25 @@ export class Router {
|
||||
setUpLocationChangeListener(): void {
|
||||
// Zone.current.wrap is needed because of the issue with RxJS scheduler,
|
||||
// which does not work properly with zone.js in IE and Safari
|
||||
this.locationSubscription = <any>this.location.subscribe(Zone.current.wrap((change: any) => {
|
||||
const rawUrlTree = this.urlSerializer.parse(change['url']);
|
||||
const lastNavigation = this.navigations.value;
|
||||
if (!this.locationSubscription) {
|
||||
this.locationSubscription = <any>this.location.subscribe(Zone.current.wrap((change: any) => {
|
||||
const rawUrlTree = this.urlSerializer.parse(change['url']);
|
||||
const lastNavigation = this.navigations.value;
|
||||
|
||||
// If the user triggers a navigation imperatively (e.g., by using navigateByUrl),
|
||||
// and that navigation results in 'replaceState' that leads to the same URL,
|
||||
// we should skip those.
|
||||
if (lastNavigation && lastNavigation.imperative &&
|
||||
lastNavigation.rawUrl.toString() === rawUrlTree.toString()) {
|
||||
return;
|
||||
}
|
||||
// If the user triggers a navigation imperatively (e.g., by using navigateByUrl),
|
||||
// and that navigation results in 'replaceState' that leads to the same URL,
|
||||
// we should skip those.
|
||||
if (lastNavigation && lastNavigation.imperative &&
|
||||
lastNavigation.rawUrl.toString() === rawUrlTree.toString()) {
|
||||
return;
|
||||
}
|
||||
|
||||
setTimeout(() => {
|
||||
this.scheduleNavigation(
|
||||
rawUrlTree, false, {skipLocationChange: change['pop'], replaceUrl: true});
|
||||
}, 0);
|
||||
}));
|
||||
setTimeout(() => {
|
||||
this.scheduleNavigation(
|
||||
rawUrlTree, false, {skipLocationChange: change['pop'], replaceUrl: true});
|
||||
}, 0);
|
||||
}));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@ -443,7 +445,12 @@ export class Router {
|
||||
/**
|
||||
* Disposes of the router.
|
||||
*/
|
||||
dispose(): void { this.locationSubscription.unsubscribe(); }
|
||||
dispose(): void {
|
||||
if (this.locationSubscription) {
|
||||
this.locationSubscription.unsubscribe();
|
||||
this.locationSubscription = null;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Applies an array of commands to the current url tree and creates a new url tree.
|
||||
|
Reference in New Issue
Block a user