UNPKG

ionic-angular

Version:

A powerful framework for building mobile and progressive web apps with JavaScript and Angular 2

181 lines 5.87 kB
import { ScrollView } from '../util/scroll-view'; /** * \@name Events * \@description * Events is a publish-subscribe style event system for sending and responding to application-level * events across your app. * * \@usage * ```ts * import { Events } from 'ionic-angular'; * * constructor(public events: Events) {} * * // first page (publish an event when a user is created) * function createUser(user) { * console.log('User created!') * events.publish('user:created', user, Date.now()); * } * * // second page (listen for the user created event) * events.subscribe('user:created', (user, time) => { * // user and time are the same arguments passed in `events.publish(user, time)` * console.log('Welcome', user, 'at', time); * }); * * ``` * \@demo /docs/v2/demos/src/events/ */ export var Events = (function () { function Events() { this._channels = []; } /** * Subscribe to an event topic. Events that get posted to that topic will trigger the provided handler. * * @param {?} topic * @param {...?} handlers * @return {?} */ Events.prototype.subscribe = function (topic) { var _this = this; var handlers = []; for (var _i = 1; _i < arguments.length; _i++) { handlers[_i - 1] = arguments[_i]; } if (!this._channels[topic]) { this._channels[topic] = []; } handlers.forEach(function (handler) { _this._channels[topic].push(handler); }); }; /** * Unsubscribe from the given topic. Your handler will no longer receive events published to this topic. * * * @param {?} topic * @param {?=} handler * @return {?} true if a handler was removed */ Events.prototype.unsubscribe = function (topic, handler) { if (handler === void 0) { handler = null; } var /** @type {?} */ t = this._channels[topic]; if (!t) { // Wasn't found, wasn't removed return false; } if (!handler) { // Remove all handlers for this topic delete this._channels[topic]; return true; } // We need to find and remove a specific handler var /** @type {?} */ 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._channels[topic]; } return true; }; /** * Publish an event to the given topic. * * @param {?} topic * @param {...?} args * @return {?} */ Events.prototype.publish = function (topic) { var args = []; for (var _i = 1; _i < arguments.length; _i++) { args[_i - 1] = arguments[_i]; } var /** @type {?} */ t = this._channels[topic]; if (!t) { return null; } var /** @type {?} */ responses = []; t.forEach(function (handler) { responses.push(handler.apply(void 0, args)); }); return responses; }; return Events; }()); function Events_tsickle_Closure_declarations() { /** @type {?} */ Events.prototype._channels; } /** * @param {?} plt * @param {?} dom * @return {?} */ export function setupEvents(plt, dom) { var /** @type {?} */ events = new Events(); var /** @type {?} */ win = plt.win(); var /** @type {?} */ doc = plt.doc(); // start listening for resizes XXms after the app starts plt.timeout(function () { win.addEventListener('online', function (ev) { events.publish('app:online', ev); }, false); win.addEventListener('offline', function (ev) { events.publish('app:offline', ev); }, false); win.addEventListener('orientationchange', function (ev) { events.publish('app:rotated', ev); }); // When that status taps, we respond win.addEventListener('statusTap', function (ev) { // TODO: Make this more better var /** @type {?} */ el = (doc.elementFromPoint(plt.width() / 2, plt.height() / 2)); if (!el) { return; } var /** @type {?} */ contentEle = (el.closest('.scroll-content')); if (contentEle) { var /** @type {?} */ scroll = new ScrollView(plt, dom); scroll.init(contentEle, 0, 0); // We need to stop scrolling if it's happening and scroll up ((contentEle.style))['WebkitBackfaceVisibility'] = 'hidden'; ((contentEle.style))['WebkitTransform'] = 'translate3d(0,0,0)'; dom.write(function () { contentEle.style.overflow = 'hidden'; /** * @return {?} */ function finish() { contentEle.style.overflow = ''; ((contentEle.style))['WebkitBackfaceVisibility'] = ''; ((contentEle.style))['WebkitTransform'] = ''; } var /** @type {?} */ didScrollTimeout = plt.timeout(function () { finish(); }, 400); scroll.scrollTo(0, 0, 300).then(function () { plt.cancelTimeout(didScrollTimeout); finish(); }); }); } }); }, 2000); return events; } /** * @param {?} plt * @param {?} dom * @return {?} */ export function setupProvideEvents(plt, dom) { return function () { return setupEvents(plt, dom); }; } //# sourceMappingURL=events.js.map