UNPKG

upfront-editable

Version:
110 lines (95 loc) 2.9 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = eventable; var _jquery = _interopRequireDefault(require("jquery")); // Eventable Mixin. // // Simple mixin to add event emitter methods to an object (Publish/Subscribe). // // Add on, off and notify methods to an object: // eventable(obj) // // publish an event: // obj.notify(context, 'action', param1, param2) // // Optionally pass a context that will be applied to every event: // eventable(obj, context) // // With this publishing can omit the context argument: // obj.notify('action', param1, param2) // // Subscribe to a 'channel' // obj.on('action', funtion(param1, param2){ ... }) // // Unsubscribe an individual listener: // obj.off('action', method) // // Unsubscribe all listeners of a channel: // obj.off('action') // // Unsubscribe all listeners of all channels: // obj.off() function eventable(obj, notifyContext) { _jquery["default"].extend(obj, getEventableModule(notifyContext)); } function getEventableModule(notifyContext) { var listeners = {}; function addListener(events, listener) { events.split(' ').forEach(function (event) { listeners[event] = listeners[event] || []; listeners[event].unshift(listener); }); } function removeListener(event, listener) { var eventListeners = listeners[event]; if (!eventListeners) return; var index = eventListeners.indexOf(listener); if (index < 0) return; eventListeners.splice(index, 1); } // Public Methods return { on: function on(event, listener) { if (arguments.length === 2) { addListener(event, listener); } else if (arguments.length === 1) { for (var eventType in event) { addListener(eventType, event[eventType]); } } return this; }, off: function off(event, listener) { if (arguments.length === 2) { removeListener(event, listener); } else if (arguments.length === 1) { listeners[event] = []; } else { listeners = {}; } }, notify: function notify(context, event) { var args = Array.from(arguments); if (notifyContext) { event = context; context = notifyContext; args.splice(0, 1); } else { args.splice(0, 2); } if (this.switchContext) { var nextEvent = this.switchContext.events.shift(); if (event !== nextEvent) this.switchContext = undefined; } var eventListeners = listeners[event]; if (!eventListeners) return; // Execute the newest listeners first. // Stop if a listener returns false. eventListeners.every(function (listener) { return listener.apply(context, args) !== false; }); } }; } module.exports = exports.default;