feat(router): Allow navigation without updating the URL (#9608)

This commit is contained in:
Brandon
2016-08-04 13:46:09 -05:00
committed by Alex Rickabaugh
parent 2b704f0586
commit 63b82cd730
3 changed files with 64 additions and 8 deletions

View File

@ -46,6 +46,7 @@ export interface NavigationExtras {
fragment?: string;
preserveQueryParams?: boolean;
preserveFragment?: boolean;
skipLocationChange?: boolean;
}
/**
@ -261,17 +262,21 @@ export class Router {
*
* ```
* router.navigateByUrl("/team/33/user/11");
*
* // Navigate without updating the URL
* router.navigateByUrl("/team/33/user/11", { skipLocationChange: true });
* ```
*
* In opposite to `navigate`, `navigateByUrl` takes a whole URL
* and does not apply any delta to the current one.
*/
navigateByUrl(url: string|UrlTree): Promise<boolean> {
navigateByUrl(url: string|UrlTree, extras: NavigationExtras = {skipLocationChange: false}):
Promise<boolean> {
if (url instanceof UrlTree) {
return this.scheduleNavigation(url, false);
return this.scheduleNavigation(url, extras);
} else {
const urlTree = this.urlSerializer.parse(url);
return this.scheduleNavigation(urlTree, false);
return this.scheduleNavigation(urlTree, extras);
}
}
@ -288,13 +293,17 @@ export class Router {
*
* ```
* router.navigate(['team', 33, 'team', '11], {relativeTo: route});
*
* // Navigate without updating the URL
* router.navigate(['team', 33, 'team', '11], {relativeTo: route, skipLocationChange: true });
* ```
*
* In opposite to `navigateByUrl`, `navigate` always takes a delta
* that is applied to the current URL.
*/
navigate(commands: any[], extras: NavigationExtras = {}): Promise<boolean> {
return this.scheduleNavigation(this.createUrlTree(commands, extras), false);
navigate(commands: any[], extras: NavigationExtras = {skipLocationChange: false}):
Promise<boolean> {
return this.scheduleNavigation(this.createUrlTree(commands, extras), extras);
}
/**
@ -319,10 +328,10 @@ export class Router {
}
}
private scheduleNavigation(url: UrlTree, preventPushState: boolean): Promise<boolean> {
private scheduleNavigation(url: UrlTree, extras: NavigationExtras): Promise<boolean> {
const id = ++this.navigationId;
this.routerEvents.next(new NavigationStart(id, this.serializeUrl(url)));
return Promise.resolve().then((_) => this.runNavigate(url, preventPushState, id));
return Promise.resolve().then((_) => this.runNavigate(url, extras.skipLocationChange, id));
}
private setUpLocationChangeListener(): void {