From 64b52b54e4954782172273d137a1a70e5472d0e7 Mon Sep 17 00:00:00 2001 From: "Manu Mtz.-Almeida" Date: Tue, 9 Oct 2018 09:53:32 -0500 Subject: [PATCH] feat(menu): add new lifeycle events --- angular/BREAKING.md | 6 ++++++ angular/src/directives/proxies.ts | 8 +++++--- core/src/components.d.ts | 14 +++++++++++--- core/src/components/menu/menu.tsx | 28 +++++++++++++++++++++------- 4 files changed, 43 insertions(+), 13 deletions(-) diff --git a/angular/BREAKING.md b/angular/BREAKING.md index 3e3c1beee8b..30cedafbc49 100644 --- a/angular/BREAKING.md +++ b/angular/BREAKING.md @@ -834,6 +834,12 @@ The `content` prop has been renamed to `contentId` and it points to the DOM id o ``` +### Events renamed + +- `ionClose` was renamed to `ionDidClose` +- `ionOpen` was renamed to `ionDidOpen` + + **New Usage Example:** ```html diff --git a/angular/src/directives/proxies.ts b/angular/src/directives/proxies.ts index 228381e9289..12800b94b49 100644 --- a/angular/src/directives/proxies.ts +++ b/angular/src/directives/proxies.ts @@ -459,15 +459,17 @@ export class ListHeader { export declare interface Menu extends StencilComponents<'IonMenu'> {} @Component({ selector: 'ion-menu', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, template: '', inputs: ['contentId', 'menuId', 'type', 'disabled', 'side', 'swipeGesture', 'maxEdgeStart'] }) export class Menu { - ionOpen: EventEmitter; - ionClose: EventEmitter; + ionWillOpen: EventEmitter; + ionWillClose: EventEmitter; + ionDidOpen: EventEmitter; + ionDidClose: EventEmitter; ionMenuChange: EventEmitter; constructor(r: ElementRef) { const el = r.nativeElement; proxyMethods(this, el, ['isOpen', 'isActive', 'open', 'close', 'toggle', 'setOpen']); proxyInputs(this, el, ['contentId', 'menuId', 'type', 'disabled', 'side', 'swipeGesture', 'maxEdgeStart']); - proxyOutputs(this, el, ['ionOpen', 'ionClose', 'ionMenuChange']); + proxyOutputs(this, el, ['ionWillOpen', 'ionWillClose', 'ionDidOpen', 'ionDidClose', 'ionMenuChange']); } } diff --git a/core/src/components.d.ts b/core/src/components.d.ts index 339e9960071..b34b211b725 100644 --- a/core/src/components.d.ts +++ b/core/src/components.d.ts @@ -2565,15 +2565,23 @@ export namespace Components { /** * Emitted when the menu is closed. */ - 'onIonClose'?: (event: CustomEvent) => void; + 'onIonDidClose'?: (event: CustomEvent) => void; + /** + * Emitted when the menu is open. + */ + 'onIonDidOpen'?: (event: CustomEvent) => void; /** * Emitted when the menu state is changed. */ 'onIonMenuChange'?: (event: CustomEvent) => void; /** - * Emitted when the menu is open. + * Emitted when the menu is about to be closed. + */ + 'onIonWillClose'?: (event: CustomEvent) => void; + /** + * Emitted when the menu is about to be opened. */ - 'onIonOpen'?: (event: CustomEvent) => void; + 'onIonWillOpen'?: (event: CustomEvent) => void; /** * Which side of the view the menu should be placed. Default `"start"`. */ diff --git a/core/src/components/menu/menu.tsx b/core/src/components/menu/menu.tsx index 60a406fbba1..eae2ea56c68 100644 --- a/core/src/components/menu/menu.tsx +++ b/core/src/components/menu/menu.tsx @@ -116,15 +116,24 @@ export class Menu implements ComponentInterface, MenuI { */ @Prop() maxEdgeStart = 50; + /** + * Emitted when the menu is about to be opened. + */ + @Event() ionWillOpen!: EventEmitter; + + /** + * Emitted when the menu is about to be closed. + */ + @Event() ionWillClose!: EventEmitter; /** * Emitted when the menu is open. */ - @Event() ionOpen!: EventEmitter; + @Event() ionDidOpen!: EventEmitter; /** * Emitted when the menu is closed. */ - @Event() ionClose!: EventEmitter; + @Event() ionDidClose!: EventEmitter; /** * Emitted when the menu state is changed. @@ -254,7 +263,7 @@ export class Menu implements ComponentInterface, MenuI { return this._isOpen; } - this.beforeAnimation(); + this.beforeAnimation(shouldOpen); await this.loadAnimation(); await this.startAnimation(shouldOpen, animated); this.afterAnimation(shouldOpen); @@ -316,7 +325,7 @@ export class Menu implements ComponentInterface, MenuI { } private onWillStart(): Promise { - this.beforeAnimation(); + this.beforeAnimation(!this._isOpen); return this.loadAnimation(); } @@ -385,7 +394,7 @@ export class Menu implements ComponentInterface, MenuI { .progressEnd(shouldComplete, stepValue, realDur); } - private beforeAnimation() { + private beforeAnimation(shouldOpen: boolean) { assert(!this.isAnimating, '_before() should not be called while animating'); // this places the menu into the correct location before it animates in @@ -396,6 +405,11 @@ export class Menu implements ComponentInterface, MenuI { } this.blocker.block(); this.isAnimating = true; + if (shouldOpen) { + this.ionWillOpen.emit(); + } else { + this.ionWillClose.emit(); + } } private afterAnimation(isOpen: boolean) { @@ -421,7 +435,7 @@ export class Menu implements ComponentInterface, MenuI { } // emit open event - this.ionOpen.emit(); + this.ionDidOpen.emit(); } else { // remove css classes this.el.classList.remove(SHOW_MENU); @@ -433,7 +447,7 @@ export class Menu implements ComponentInterface, MenuI { } // emit close event - this.ionClose.emit(); + this.ionDidClose.emit(); } }