mirror of
https://github.com/ionic-team/ionic-framework.git
synced 2025-08-22 05:21:52 +08:00
refactor(nav): update browser url when needed when changing tabs
This commit is contained in:
@ -264,6 +264,11 @@ export class Nav implements PublicNav, NavOutlet {
|
|||||||
return reconcileFromExternalRouterImpl(this, component, data, escapeHatch, isTopLevel);
|
return reconcileFromExternalRouterImpl(this, component, data, escapeHatch, isTopLevel);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Method()
|
||||||
|
activateFromTab() {
|
||||||
|
return activateFromTabImpl(this);
|
||||||
|
}
|
||||||
|
|
||||||
canSwipeBack(): boolean {
|
canSwipeBack(): boolean {
|
||||||
return (this.swipeBackEnabled &&
|
return (this.swipeBackEnabled &&
|
||||||
// this.childNavs.length === 0 &&
|
// this.childNavs.length === 0 &&
|
||||||
@ -617,23 +622,25 @@ export function isUrl(component: any): boolean {
|
|||||||
return typeof component === 'string' && component.charAt(0) === '/';
|
return typeof component === 'string' && component.charAt(0) === '/';
|
||||||
}
|
}
|
||||||
|
|
||||||
export function navigateToUrl(nav: Nav, url: string, method: string): Promise<NavResult> {
|
export function navigateToUrl(nav: Nav, url: string, _method: string): Promise<any> {
|
||||||
let routingPromise: Promise<any> = null;
|
if (!nav.routerDelegate) {
|
||||||
return new Promise((resolve, reject) => {
|
nav.routerDelegate = new DomRouterDelegate();
|
||||||
nav.urlExternalNavMap.set(url, {
|
}
|
||||||
url,
|
return nav.routerDelegate.pushUrlState(url);
|
||||||
method,
|
}
|
||||||
resolve,
|
|
||||||
reject
|
export function activateFromTabImpl(nav: Nav): Promise<any> {
|
||||||
});
|
return nav.onAllTransitionsComplete().then(() => {
|
||||||
if (!nav.routerDelegate) {
|
// if there is not a view set and it's not transitioning,
|
||||||
nav.routerDelegate = new DomRouterDelegate();
|
// go ahead and set the root
|
||||||
|
if (nav.getViews().length === 0 && !nav.isTransitioning()) {
|
||||||
|
return nav.setRoot(nav.root);
|
||||||
}
|
}
|
||||||
routingPromise = nav.routerDelegate.pushUrlState(url);
|
|
||||||
}).then((navResult: NavResult) => {
|
// okay, we have a view here, and it's almost certainly the correct view
|
||||||
return routingPromise.then(() => {
|
// so what we need to do is update the browsers url to match what's in the top view
|
||||||
return navResult;
|
const viewController = nav.getActive() as ViewController;
|
||||||
});
|
return viewController && viewController.url ? navigateToUrl(nav, viewController.url, null) : Promise.resolve();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -89,6 +89,9 @@ boolean
|
|||||||
|
|
||||||
## Methods
|
## Methods
|
||||||
|
|
||||||
|
#### activateFromTab()
|
||||||
|
|
||||||
|
|
||||||
#### canGoBack()
|
#### canGoBack()
|
||||||
|
|
||||||
|
|
||||||
|
@ -126,13 +126,7 @@ export class Tab {
|
|||||||
// the tab's nav has not been initialized externally, so
|
// the tab's nav has not been initialized externally, so
|
||||||
// check if we need to initiailize it
|
// check if we need to initiailize it
|
||||||
return nav.componentOnReady()
|
return nav.componentOnReady()
|
||||||
.then(() => nav.onAllTransitionsComplete())
|
.then(() => nav.activateFromTab());
|
||||||
.then<any>(() => {
|
|
||||||
if (nav.getViews().length === 0 && !nav.isTransitioning() && !nav.initialized) {
|
|
||||||
return nav.setRoot(nav.root);
|
|
||||||
}
|
|
||||||
return Promise.resolve();
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user