Skip to content

Commit

Permalink
fix(menu): menu registers itself before it's ready
Browse files Browse the repository at this point in the history
  • Loading branch information
manucorporat committed Oct 1, 2018
1 parent a5c2cc1 commit 08beee3
Show file tree
Hide file tree
Showing 4 changed files with 25 additions and 38 deletions.
6 changes: 0 additions & 6 deletions core/src/components.d.ts
Expand Up @@ -29,7 +29,6 @@ import {
LoadingOptions,
MenuChangeEventDetail,
MenuControllerI,
MenuI,
ModalOptions,
Mode,
NavComponent,
Expand Down Expand Up @@ -2439,12 +2438,7 @@ export namespace Components {
}

interface IonMenuController {
'_createAnimation': (type: string, menuCmp: MenuI) => Promise<Animation>;
'_getInstance': () => Promise<MenuControllerI>;
'_register': (menu: MenuI) => void;
'_setActiveMenu': (menu: MenuI) => void;
'_setOpen': (menu: MenuI, shouldOpen: boolean, animated: boolean) => Promise<boolean>;
'_unregister': (menu: MenuI) => void;
/**
* Close the menu. If no menu is specified, then it will close any menu that is open. If a menu is specified, it will close that menu.
*/
Expand Down
23 changes: 11 additions & 12 deletions core/src/components/menu-controller/menu-controller.ts
Expand Up @@ -198,32 +198,37 @@ export class MenuController implements MenuControllerI {
}

@Method()
_getInstance(): Promise<MenuControllerI> {
return Promise.resolve(this);
}

_register(menu: MenuI) {
if (this.menus.indexOf(menu) < 0) {
this.menus.push(menu);
const menus = this.menus;
if (menus.indexOf(menu) < 0) {
if (!menu.disabled) {
this._setActiveMenu(menu);
}
menus.push(menu);
}
}

@Method()
_unregister(menu: MenuI) {
const index = this.menus.indexOf(menu);
if (index > -1) {
this.menus.splice(index, 1);
}
}

@Method()
_setActiveMenu(menu: MenuI) {
// if this menu should be enabled
// then find all the other menus on this same side
// and automatically disable other same side menus
const side = menu.side;
this.menus
.filter(m => m.side === side && m !== menu)
.forEach(m => (m.disabled = true));
.forEach(m => m.disabled = true);
}

@Method()
async _setOpen(menu: MenuI, shouldOpen: boolean, animated: boolean): Promise<boolean> {
if (this.isAnimatingSync()) {
return false;
Expand All @@ -237,12 +242,6 @@ export class MenuController implements MenuControllerI {
return menu._setOpen(shouldOpen, animated);
}

@Method()
_getInstance(): Promise<MenuControllerI> {
return Promise.resolve(this);
}

@Method()
_createAnimation(type: string, menuCmp: MenuI): Promise<Animation> {
const animationBuilder = this.menuAnimations.get(type);
if (!animationBuilder) {
Expand Down
27 changes: 7 additions & 20 deletions core/src/components/menu/menu.tsx
Expand Up @@ -136,15 +136,10 @@ export class Menu implements ComponentInterface, MenuI {

if (this.isServer) {
this.disabled = true;
} else {
this.menuCtrl = await this.lazyMenuCtrl.componentOnReady().then(p => p._getInstance());
}
}

async componentDidLoad() {
if (this.isServer) {
return;
}

const menuCtrl = this.menuCtrl = await this.lazyMenuCtrl.componentOnReady().then(p => p._getInstance());
const el = this.el;
const parent = el.parentNode as any;
const content = this.contentId !== undefined
Expand All @@ -166,17 +161,8 @@ export class Menu implements ComponentInterface, MenuI {
this.typeChanged(this.type, undefined);
this.sideChanged();

let isEnabled = !this.disabled;
if (isEnabled) {
const menus = await this.menuCtrl!.getMenus();
isEnabled = !menus.some((m: any) => {
return m.side === this.side && !m.disabled;
});
}

// register this menu with the app's menu controller
this.menuCtrl!._register(this);
this.ionMenuChange.emit({ disabled: !isEnabled, open: this._isOpen });
menuCtrl!._register(this);

this.gesture = (await import('../../utils/gesture/gesture')).createGesture({
el: this.doc,
Expand All @@ -190,12 +176,13 @@ export class Menu implements ComponentInterface, MenuI {
onMove: ev => this.onMove(ev),
onEnd: ev => this.onEnd(ev),
});

// mask it as enabled / disabled
this.disabled = !isEnabled;
this.updateState();
}

componentDidLoad() {
this.ionMenuChange.emit({ disabled: this.disabled, open: this._isOpen });
}

componentDidUnload() {
this.blocker.destroy();
this.menuCtrl!._unregister(this);
Expand Down
7 changes: 7 additions & 0 deletions core/src/components/menu/test/basic/index.html
Expand Up @@ -103,6 +103,13 @@

<script>
const menu = document.querySelector('ion-menu-controller');
start();

async function start() {
await menu.componentOnReady();
menu.open('start');
}

function openStart() {
console.log('Open start menu');
menu.open('start');
Expand Down

0 comments on commit 08beee3

Please sign in to comment.