123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161 |
- import { ScrollView } from './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';
- *
- * // first page (publish an event when a user is created)
- * constructor(public events: Events) { }
- *
- * createUser(user) {
- * console.log('User created!')
- * this.events.publish('user:created', user, Date.now());
- * }
- *
- *
- * // second page (listen for the user created event after function is called)
- * constructor(public events: Events) {
- * 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/demos/src/events/
- */
- export class Events {
- constructor() {
- this._channels = [];
- }
- /**
- * 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, ...handlers) {
- if (!this._channels[topic]) {
- this._channels[topic] = [];
- }
- handlers.forEach((handler) => {
- this._channels[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, handler = null) {
- let 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
- let 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 {string} topic the topic to publish to
- * @param {any} eventData the data to send as the event
- */
- publish(topic, ...args) {
- var t = this._channels[topic];
- if (!t) {
- return null;
- }
- let responses = [];
- t.forEach((handler) => {
- responses.push(handler(...args));
- });
- return responses;
- }
- }
- /**
- * @hidden
- */
- export function setupEvents(plt, dom) {
- const events = new Events();
- const win = plt.win();
- const doc = plt.doc();
- // start listening for resizes XXms after the app starts
- plt.timeout(() => {
- win.addEventListener('online', (ev) => {
- events.publish('app:online', ev);
- }, false);
- win.addEventListener('offline', (ev) => {
- events.publish('app:offline', ev);
- }, false);
- win.addEventListener('orientationchange', (ev) => {
- events.publish('app:rotated', ev);
- });
- // When that status taps, we respond
- win.addEventListener('statusTap', () => {
- // TODO: Make this more better
- let el = doc.elementFromPoint(plt.width() / 2, plt.height() / 2);
- if (!el) {
- return;
- }
- let contentEle = el.closest('.scroll-content');
- if (contentEle) {
- var style = contentEle.style;
- var scroll = new ScrollView(null, plt, dom);
- scroll._el = contentEle;
- // We need to stop scrolling if it's happening and scroll up
- style['WebkitBackfaceVisibility'] = 'hidden';
- style['WebkitTransform'] = 'translate3d(0,0,0)';
- dom.write(function () {
- style.overflow = 'hidden';
- function finish() {
- style.overflow = '';
- style['WebkitBackfaceVisibility'] = '';
- style['WebkitTransform'] = '';
- }
- let didScrollTimeout = plt.timeout(() => {
- finish();
- }, 400);
- scroll.scrollTo(0, 0, 300).then(() => {
- plt.cancelTimeout(didScrollTimeout);
- finish();
- });
- });
- }
- });
- }, 2000);
- return events;
- }
- /**
- * @hidden
- */
- export function setupProvideEvents(plt, dom) {
- return function () {
- return setupEvents(plt, dom);
- };
- }
- //# sourceMappingURL=events.js.map
|