UNPKG

marbles

Version:

Front-end framework for routing, http, and data handling

156 lines (129 loc) 3.27 kB
'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); /* @flow weak */ var EVENT_SPLITTER = /\s+/; function initEvents(obj) { if (!obj.__events) { obj.__events = {}; } } /** * @deprecated Use the Dispatcher instead * @see Marbles.Dispatcher * @memberof Marbles * @mixin */ var Events = { on: function on(events, callback, context, options) { initEvents(this); if (!Array.isArray(events)) { events = events.split(EVENT_SPLITTER); } var name; for (var i = 0, _len = events.length; i < _len; i++) { name = events[i]; if (!this.__events[name]) { this.__events[name] = []; } this.__events[name].push({ callback: callback, context: context || this, options: options || {} }); } return this; // chainable }, once: function once(events, callback, context, options) { if (!Array.isArray(events)) { events = events.split(EVENT_SPLITTER); } var bindEvent = (function (name) { var __callback = (function (_callback) { function __callback() { return _callback.apply(this, arguments); } __callback.toString = function () { return _callback.toString(); }; return __callback; })(function () { this.off(name, __callback, this); callback.apply(context, arguments); }); this.on(name, __callback, this, options); }).bind(this); for (var i = 0, _len = events.length; i < _len; i++) { bindEvent(events[i]); } return this; // chainable }, off: function off(events, callback, context) { // Allow unbinding all events at once if (arguments.length === 0) { if (this.hasOwnProperty('__events')) { delete this.__events; } return this; // chainable } if (!Array.isArray(events)) { events = events.split(EVENT_SPLITTER); } if (!this.__events) { return this; // chainable } var __filterFn = function __filterFn(binding) { if (context && context !== binding.context) { return true; } if (callback && callback !== binding.callback) { return true; } return false; }; var name, i, _len, bindings; for (i = 0, _len = events.length; i < _len; i++) { name = events[i]; if (callback === undefined && context === undefined) { if (this.__events.hasOwnProperty(name)) { delete this.__events[name]; } continue; } bindings = this.__events[name]; if (!bindings) { continue; } this.__events[name] = Array.prototype.filter.call(bindings, __filterFn); } return this; // chainable }, trigger: function trigger(events) { var args = Array.prototype.slice.call(arguments, 1); if (!Array.isArray(events)) { events = events.split(EVENT_SPLITTER); } if (!this.__events) { return this; // chainable } var bindings, binding, i, j, _len, _l; for (i = 0, _len = events.length; i < _len; i++) { bindings = this.__events[events[i]]; if (!bindings) { continue; } for (j = 0, _l = bindings.length; j < _l; j++) { binding = bindings[j]; if (binding.options.args === false) { binding.callback.call(binding.context); } else { binding.callback.apply(binding.context, args); } } } return this; // chainable } }; exports['default'] = Events; module.exports = exports['default'];