UNPKG

upfront-editable

Version:
113 lines (95 loc) 2.86 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _from = require('babel-runtime/core-js/array/from'); var _from2 = _interopRequireDefault(_from); exports.default = eventable; var _jquery = require('jquery'); var _jquery2 = _interopRequireDefault(_jquery); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } // 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) { _jquery2.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 = (0, _from2.default)(arguments); if (notifyContext) { event = context; context = notifyContext; args.splice(0, 1); } else { args.splice(0, 2); } 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; }); } }; }