diff --git a/src/components/app/app-root.ts b/src/components/app/app-root.ts index 07800a4488..38c52634e3 100644 --- a/src/components/app/app-root.ts +++ b/src/components/app/app-root.ts @@ -118,10 +118,6 @@ export class IonicApp extends Ion implements OnInit { _getActivePortal(): OverlayPortal { const defaultPortal = this._overlayPortal; const modalPortal = this._modalPortal; - - assert(defaultPortal, 'default must be valid'); - assert(modalPortal, 'modal must be valid'); - const hasModal = modalPortal.length() > 0; const hasDefault = defaultPortal.length() > 0; diff --git a/src/components/app/app.ts b/src/components/app/app.ts index c08f5d9af7..01dfbf1b4f 100644 --- a/src/components/app/app.ts +++ b/src/components/app/app.ts @@ -1,4 +1,4 @@ -import { EventEmitter, Injectable } from '@angular/core'; +import { EventEmitter, Injectable, Optional } from '@angular/core'; import { Title } from '@angular/platform-browser'; import { AppPortal, IonicApp } from './app-root'; @@ -9,7 +9,7 @@ import { isNav, isTabs, NavOptions, DIRECTION_FORWARD, DIRECTION_BACK } from '.. import { NavController } from '../../navigation/nav-controller'; import { Platform } from '../../platform/platform'; import { ViewController } from '../../navigation/view-controller'; - +import { MenuController } from '../menu/menu-controller'; /** * @name App @@ -67,18 +67,19 @@ export class App { constructor( private _config: Config, - private _platform: Platform + private _platform: Platform, + @Optional() private _menuCtrl?: MenuController ) { // listen for hardware back button events // register this back button action with a default priority - _platform.registerBackButtonAction(this.navPop.bind(this)); + _platform.registerBackButtonAction(this.goBack.bind(this)); this._disableScrollAssist = _config.getBoolean('disableScrollAssist', false); runInDev(() => { // During developement, navPop can be triggered by calling // window.ClickBackButton(); if (!window['HWBackButton']) { - window['HWBackButton'] = this.navPop.bind(this); + window['HWBackButton'] = this.goBack.bind(this); } }); } @@ -233,6 +234,23 @@ export class App { return portal.insertPages(-1, [enteringView], opts); } + goBack(): Promise { + if (this._menuCtrl && this._menuCtrl.isOpen()) { + return this._menuCtrl.close(); + } + + let navPromise = this.navPop(); + if (navPromise === null) { + // no views to go back to + // let's exit the app + if (this._config.getBoolean('navExitApp', true)) { + console.debug('app, goBack exitApp'); + this._platform.exitApp(); + } + } + return navPromise; + } + /** * @private */ @@ -275,7 +293,7 @@ export class App { const portal = this._appRoot._getActivePortal(); // first check if the root navigation has any overlays - // opened in it's portal, like alert/actionsheet/popup + // opened in it's portal, like alert/actionsheet/popup/modals if (portal) { // there is an overlay view in the portal // let's pop this one off to go back @@ -285,17 +303,7 @@ export class App { // next get the active nav, check itself and climb up all // of its parent navs until it finds a nav that can pop - let navPromise = navPop(this.getActiveNav()); - if (navPromise === null) { - // no views to go back to - // let's exit the app - if (this._config.getBoolean('navExitApp', true)) { - console.debug('app, goBack exitApp'); - this._platform.exitApp(); - } - } - - return navPromise; + return navPop(this.getActiveNav()); } } diff --git a/src/components/menu/menu-controller.ts b/src/components/menu/menu-controller.ts index 9638277e6a..b24245f932 100644 --- a/src/components/menu/menu-controller.ts +++ b/src/components/menu/menu-controller.ts @@ -211,12 +211,17 @@ export class MenuController { } /** - * @param {string} [menuId] Optionally get the menu by its id, or side. - * @return {boolean} Returns true if the menu is currently open, otherwise false. + * @param {string} [menuId] Optionally get the menu by its id, or side. + * @return {boolean} Returns true if the specified menu is currently open, otherwise false. + * If the menuId is not specified, it returns true if ANY menu is currenly open. */ isOpen(menuId?: string): boolean { - let menu = this.get(menuId); - return menu && menu.isOpen || false; + if (menuId) { + var menu = this.get(menuId); + return menu && menu.isOpen || false; + } else { + return !!this.getOpen(); + } } /** diff --git a/src/components/nav/nav.ts b/src/components/nav/nav.ts index 6138b73fc8..40a23371f1 100644 --- a/src/components/nav/nav.ts +++ b/src/components/nav/nav.ts @@ -6,6 +6,7 @@ import { DeepLinker } from '../../navigation/deep-linker'; import { GestureController } from '../../gestures/gesture-controller'; import { isTrueProperty } from '../../util/util'; import { Keyboard } from '../../util/keyboard'; +import { NavController } from '../../navigation/nav-controller'; import { NavControllerBase } from '../../navigation/nav-controller-base'; import { NavOptions } from '../../navigation/nav-util'; import { TransitionController } from '../../transitions/transition-controller'; @@ -57,7 +58,7 @@ export class Nav extends NavControllerBase implements AfterViewInit { constructor( @Optional() viewCtrl: ViewController, - @Optional() parent: NavControllerBase, + @Optional() parent: NavController, app: App, config: Config, keyboard: Keyboard, diff --git a/src/navigation/nav-controller-base.ts b/src/navigation/nav-controller-base.ts index fcdb828c39..3d1e318f08 100644 --- a/src/navigation/nav-controller-base.ts +++ b/src/navigation/nav-controller-base.ts @@ -25,7 +25,7 @@ import { DomController } from '../util/dom-controller'; */ export class NavControllerBase extends Ion implements NavController { - _children: any[] = []; + _children: NavController[] = []; _ids: number = -1; _init = false; _isPortal: boolean; @@ -883,15 +883,15 @@ export class NavControllerBase extends Ion implements NavController { this._app.viewWillUnload.emit(view); } - getActiveChildNav(): any { + getActiveChildNav(): NavController { return this._children[this._children.length - 1]; } - registerChildNav(nav: any) { + registerChildNav(nav: NavController) { this._children.push(nav); } - unregisterChildNav(nav: any) { + unregisterChildNav(nav: NavController) { removeArrayItem(this._children, nav); } diff --git a/src/navigation/nav-controller.ts b/src/navigation/nav-controller.ts index 2a8ea3b25a..6098ac9252 100644 --- a/src/navigation/nav-controller.ts +++ b/src/navigation/nav-controller.ts @@ -597,4 +597,8 @@ export abstract class NavController { */ abstract canGoBack(): boolean; + /** + * @private + */ + abstract registerChildNav(nav: NavController); }