121 lines
2.4 KiB
JavaScript
121 lines
2.4 KiB
JavaScript
/**
|
|
* @file
|
|
* To have minimal reactive objects ala Backbone, Vue, etc.
|
|
*
|
|
* Not currently in use, but GridStack, etc. due to core/backbone deprecation.
|
|
* Credits: https://gist.github.com/mudge/5830382
|
|
*/
|
|
|
|
/* global module */
|
|
(function () {
|
|
|
|
'use strict';
|
|
|
|
var _symbol = typeof Symbol !== 'undefined' && Symbol;
|
|
var _typeof = typeof _symbol === 'function' &&
|
|
typeof _symbol.iterator === 'symbol' ?
|
|
function (obj) {
|
|
return typeof obj;
|
|
} : function (obj) {
|
|
return obj &&
|
|
typeof _symbol === 'function' &&
|
|
obj.constructor === _symbol ?
|
|
'symbol' :
|
|
typeof obj;
|
|
};
|
|
|
|
var fn = Eventify.prototype;
|
|
fn.constructor = Eventify;
|
|
fn._events = {};
|
|
|
|
/**
|
|
* Object for Eventify.
|
|
*
|
|
* @namespace
|
|
*
|
|
* @param {Object} obj
|
|
* The optional object to merge.
|
|
*
|
|
* @return {Eventify|Object}
|
|
* Returns this, or the passed mixed object.
|
|
*/
|
|
function Eventify(obj) {
|
|
if (obj) {
|
|
return mixin(obj);
|
|
}
|
|
return this;
|
|
}
|
|
|
|
function mixin(obj) {
|
|
for (var key in fn) {
|
|
if (Object.prototype.hasOwnProperty.call(fn, key)) {
|
|
obj[key] = fn[key];
|
|
}
|
|
}
|
|
return obj;
|
|
}
|
|
|
|
fn.on = function (event, listener) {
|
|
var me = this;
|
|
if (_typeof(me._events[event]) !== 'object') {
|
|
me._events[event] = [];
|
|
}
|
|
|
|
me._events[event].push(listener);
|
|
return function () {
|
|
me.off(event, listener);
|
|
};
|
|
};
|
|
|
|
fn.off = function (event, listener) {
|
|
var me = this;
|
|
var idx = void 0;
|
|
|
|
if (_typeof(me._events[event]) === 'object') {
|
|
idx = me._events[event].indexOf(listener);
|
|
|
|
if (idx > -1) {
|
|
me._events[event].splice(idx, 1);
|
|
}
|
|
}
|
|
return me;
|
|
};
|
|
|
|
fn.emit = function (event) {
|
|
var me = this;
|
|
var i;
|
|
var listeners;
|
|
var length;
|
|
var args = [].slice.call(arguments, 1);
|
|
|
|
if (_typeof(me._events[event]) === 'object') {
|
|
listeners = me._events[event].slice();
|
|
length = listeners.length;
|
|
|
|
for (i = 0; i < length; i++) {
|
|
listeners[i].apply(me, args);
|
|
}
|
|
}
|
|
return me;
|
|
};
|
|
|
|
fn.once = function (event, listener) {
|
|
var me = this;
|
|
me.on(event, function g() {
|
|
me.off(event, g);
|
|
listener.apply(me, arguments);
|
|
});
|
|
return me;
|
|
};
|
|
|
|
if (typeof exports !== 'undefined') {
|
|
// Node.js.
|
|
module.exports = Eventify;
|
|
}
|
|
else {
|
|
// Browser.
|
|
window.Eventify = Eventify;
|
|
}
|
|
|
|
})();
|