diff --git a/packages/angular/src/module.ts b/packages/angular/src/module.ts index a69c0a251a..b47145908a 100644 --- a/packages/angular/src/module.ts +++ b/packages/angular/src/module.ts @@ -1,5 +1,6 @@ import { CommonModule } from '@angular/common'; import { + APP_INITIALIZER, CUSTOM_ELEMENTS_SCHEMA, ModuleWithProviders, NgModule @@ -23,7 +24,7 @@ import { ActionSheetController } from './providers/action-sheet-controller'; import { AlertController } from './providers/alert-controller'; import { AngularComponentMounter } from './providers/angular-component-mounter'; import { App } from './providers/app'; -import { Events } from './providers/events'; +import { Events, setupProvideEvents } from './providers/events'; import { LoadingController } from './providers/loading-controller'; import { MenuController } from './providers/menu-controller'; import { ModalController } from './providers/modal-controller'; @@ -81,7 +82,9 @@ export class IonicAngularModule { LoadingController, MenuController, Platform, - ToastController + ToastController, + + { provide: APP_INITIALIZER, useFactory: setupProvideEvents, multi: true }, ] }; } diff --git a/packages/angular/src/providers/events.ts b/packages/angular/src/providers/events.ts index fe5edacc1c..e534acdf60 100644 --- a/packages/angular/src/providers/events.ts +++ b/packages/angular/src/providers/events.ts @@ -1,20 +1,100 @@ import { Injectable } from '@angular/core'; -import { IonicWindow } from '../types/interfaces'; @Injectable() export class Events { + private c: {[topic: string]: Function[]} = [] as any; - subscribe(topic: string, handler: (event?: any) => void) { - return (window as IonicWindow).Ionic.Events.subscribe(topic, handler); + /** + * Subscribe to an event topic. Events that get posted to that topic will trigger the provided handler. + * + * @param {string} topic the topic to subscribe to + * @param {function} handler the event handler + */ + subscribe(topic: string, ...handlers: Function[]) { + if (!this.c[topic]) { + this.c[topic] = []; + } + handlers.forEach((handler) => { + this.c[topic].push(handler); + }); } - unsubscribe(topic: string, handler: (event?: any) => void) { - return (window as IonicWindow).Ionic.Events.unsubscribe(topic, handler); + /** + * Unsubscribe from the given topic. Your handler will no longer receive events published to this topic. + * + * @param {string} topic the topic to unsubscribe from + * @param {function} handler the event handler + * + * @return true if a handler was removed + */ + unsubscribe(topic: string, handler: Function = null) { + const t = this.c[topic]; + if (!t) { + // Wasn't found, wasn't removed + return false; + } + + if (!handler) { + // Remove all handlers for this topic + delete this.c[topic]; + return true; + } + + // We need to find and remove a specific handler + const i = t.indexOf(handler); + + if (i < 0) { + // Wasn't found, wasn't removed + return false; + } + + t.splice(i, 1); + + // If the channel is empty now, remove it from the channel map + if (!t.length) { + delete this.c[topic]; + } + + return true; } - publish(topic: string, event?: any) { - return (window as IonicWindow).Ionic.Events.publish(topic, event); - } + /** + * Publish an event to the given topic. + * + * @param {string} topic the topic to publish to + * @param {any} eventData the data to send as the event + */ + publish(topic: string, ...args: any[]) { + const t = this.c[topic]; + if (!t) { + return null; + } + const responses: any[] = []; + t.forEach((handler: any) => { + responses.push(handler(...args)); + }); + return responses; + } +} + + +export function setupEvents() { + const events = new Events(); + + window.addEventListener('online', ev => events.publish('app:online', ev)); + + window.addEventListener('offline', ev => events.publish('app:offline', ev)); + + window.addEventListener('orientationchange', ev => events.publish('app:rotated', ev)); + + return events; +} + + +export function setupProvideEvents() { + return function() { + return setupEvents(); + }; } diff --git a/packages/core/src/global/events.ts b/packages/core/src/global/events.ts index 168c116494..a30184a3ee 100644 --- a/packages/core/src/global/events.ts +++ b/packages/core/src/global/events.ts @@ -1,90 +1,6 @@ -export class Events { - private c: {[topic: string]: Function[]} = [] as any; - - /** - * Subscribe to an event topic. Events that get posted to that topic will trigger the provided handler. - * - * @param {string} topic the topic to subscribe to - * @param {function} handler the event handler - */ - subscribe(topic: string, ...handlers: Function[]) { - if (!this.c[topic]) { - this.c[topic] = []; - } - handlers.forEach((handler) => { - this.c[topic].push(handler); - }); - } - - /** - * Unsubscribe from the given topic. Your handler will no longer receive events published to this topic. - * - * @param {string} topic the topic to unsubscribe from - * @param {function} handler the event handler - * - * @return true if a handler was removed - */ - unsubscribe(topic: string, handler: Function = null) { - const t = this.c[topic]; - if (!t) { - // Wasn't found, wasn't removed - return false; - } - - if (!handler) { - // Remove all handlers for this topic - delete this.c[topic]; - return true; - } - - // We need to find and remove a specific handler - const i = t.indexOf(handler); - - if (i < 0) { - // Wasn't found, wasn't removed - return false; - } - - t.splice(i, 1); - - // If the channel is empty now, remove it from the channel map - if (!t.length) { - delete this.c[topic]; - } - - return true; - } - - /** - * Publish an event to the given topic. - * - * @param {string} topic the topic to publish to - * @param {any} eventData the data to send as the event - */ - publish(topic: string, ...args: any[]) { - const t = this.c[topic]; - if (!t) { - return null; - } - - const responses: any[] = []; - t.forEach((handler: any) => { - responses.push(handler(...args)); - }); - return responses; - } -} - export function setupEvents(win: Window, doc: Document) { - const events = new Events(); - - win.addEventListener('online', ev => events.publish('app:online', ev)); - - win.addEventListener('offline', ev => events.publish('app:offline', ev)); - - win.addEventListener('orientationchange', ev => events.publish('app:rotated', ev)); win.addEventListener('statusTap', () => { const centerElm = doc.elementFromPoint(win.innerWidth / 2, win.innerHeight / 2); @@ -94,8 +10,6 @@ export function setupEvents(win: Window, doc: Document) { scrollElm.componentOnReady(() => scrollElm.scrollToTop(300)); } } - }); - return events; } diff --git a/packages/core/src/global/ionic-global.ts b/packages/core/src/global/ionic-global.ts index 8bf91e42e8..2e1c9e89c9 100644 --- a/packages/core/src/global/ionic-global.ts +++ b/packages/core/src/global/ionic-global.ts @@ -31,7 +31,7 @@ Ionic.config = Context.config = createConfigController( Context.platforms ); -Ionic.Events = Context.Events = setupEvents(window, document); +setupEvents(window, document); // first see if the mode was set as an attribute on // which could have been set by the user, or by prerendering