@voliware/eventsystem
Advanced tools
Comparing version 1.0.5 to 1.0.6
@@ -31,13 +31,17 @@ /** | ||
let s = ''; | ||
let randomchar = () => { | ||
let n = Math.floor(Math.random() * 62); | ||
if (n < 10) { | ||
return n; | ||
} | ||
if (n < 36) return String.fromCharCode(n + 55); | ||
const randomchar = () => { | ||
const n = Math.floor(Math.random() * 62); | ||
if (n < 10) { | ||
return n; | ||
} | ||
if (n < 36) { | ||
return String.fromCharCode(n + 55); | ||
} | ||
return String.fromCharCode(n + 61); | ||
} | ||
while (s.length < length) { | ||
s += randomchar(); | ||
} | ||
return s; | ||
@@ -53,3 +57,3 @@ } | ||
getHandlersCount(event){ | ||
let event_object = this.events[event]; | ||
const event_object = this.events[event]; | ||
if(!event_object){ | ||
@@ -87,18 +91,18 @@ return 0; | ||
} | ||
let event_array = event.split('.'); | ||
const event_array = event.split('.'); | ||
let last_object = this.events; | ||
let events_object = this.events; | ||
for (let i = 0; i < event_array.length; i++) { | ||
let current_event_namespace = event_array[i]; | ||
if (!last_object[current_event_namespace]) { | ||
last_object[current_event_namespace] = {}; | ||
if (!events_object[current_event_namespace]) { | ||
events_object[current_event_namespace] = {}; | ||
} | ||
if (i === event_array.length - 1) { | ||
if (!Array.isArray(last_object[current_event_namespace].handlers)) { | ||
last_object[current_event_namespace].handlers = []; | ||
if (!Array.isArray(events_object[current_event_namespace].handlers)) { | ||
events_object[current_event_namespace].handlers = []; | ||
} | ||
last_object[current_event_namespace].handlers.push(callback); | ||
events_object[current_event_namespace].handlers.push(callback); | ||
} | ||
else { | ||
last_object = last_object[current_event_namespace]; | ||
events_object = events_object[current_event_namespace]; | ||
} | ||
@@ -114,7 +118,6 @@ } | ||
one(event, callback) { | ||
let self = this; | ||
let new_event_name = event + "." + this.generateRandomString(16); | ||
let newCallback = function(data) { | ||
const new_event_name = event + "." + this.generateRandomString(16); | ||
const newCallback = (data) => { | ||
callback(data); | ||
self.off(new_event_name); | ||
this.off(new_event_name); | ||
} | ||
@@ -129,25 +132,42 @@ this.on(new_event_name, newCallback); | ||
* @param {String} event - An event such as click, or click.foo.bar | ||
* @param {Function} [callback=null] - Callback to remove. If not found, removes | ||
* all callbacks for the event. | ||
* @param {boolean} [remove_all_child_handlers=true] - Whether to remove | ||
* all child events | ||
* all child events. Only applicable of callback is null. | ||
*/ | ||
off(event, remove_all_child_handlers = true) { | ||
off(event, callback = null, remove_all_child_handlers = true) { | ||
if(typeof event !== "string"){ | ||
event = event + ''; | ||
} | ||
let event_array = event.split('.'); | ||
const event_array = event.split('.'); | ||
let last_object = this.events; | ||
let events_object = this.events; | ||
for (let i = 0; i < event_array.length; i++) { | ||
let current_event_namespace = event_array[i]; | ||
const current_event_namespace = event_array[i]; | ||
if (i === event_array.length - 1) { | ||
if (remove_all_child_handlers) { | ||
delete last_object[current_event_namespace]; | ||
} else { | ||
delete last_object[current_event_namespace].handlers; | ||
if (Object.keys(last_object[current_event_namespace]).length === 0) { | ||
delete last_object[current_event_namespace]; | ||
// Remove a specific callback | ||
if(callback){ | ||
const handlers = events_object[current_event_namespace].handlers; | ||
for(let x = 0; x < handlers.length; x++){ | ||
if(handlers[x] === callback){ | ||
handlers.splice(x, 1); | ||
} | ||
} | ||
} | ||
} else { | ||
last_object = last_object[current_event_namespace]; | ||
else { | ||
// Remove all child handlers, ie if event is "click", | ||
// then also remove "click.foo", "click.foo.bar", etc. | ||
if (remove_all_child_handlers) { | ||
delete events_object[current_event_namespace]; | ||
} | ||
else { | ||
delete events_object[current_event_namespace].handlers; | ||
if (Object.keys(events_object[current_event_namespace]).length === 0) { | ||
delete events_object[current_event_namespace]; | ||
} | ||
} | ||
} | ||
} | ||
else { | ||
events_object = events_object[current_event_namespace]; | ||
} | ||
@@ -167,10 +187,10 @@ } | ||
} | ||
let event_array = event.split('.'); | ||
let last_object = this.events; | ||
const event_array = event.split('.'); | ||
let events_object = this.events; | ||
for (let i = 0; i < event_array.length; i++) { | ||
let current_event_namespace = event_array[i]; | ||
last_object = last_object[current_event_namespace]; | ||
events_object = events_object[current_event_namespace]; | ||
// Event does not exist | ||
if(!last_object){ | ||
return this; | ||
if(!events_object){ | ||
return; | ||
} | ||
@@ -180,3 +200,3 @@ | ||
let stack = []; | ||
stack.push(last_object); | ||
stack.push(events_object); | ||
while(stack.length){ | ||
@@ -189,3 +209,4 @@ let obj = stack.pop(); | ||
} | ||
} else { | ||
} | ||
else { | ||
stack.push(obj[k]); | ||
@@ -199,4 +220,5 @@ } | ||
} | ||
if(typeof module !== "undefined"){ | ||
module.exports = EventSystem; | ||
} |
{ | ||
"name": "@voliware/eventsystem", | ||
"version": "1.0.5", | ||
"version": "1.0.6", | ||
"description": "An event system with on/off/emit functions", | ||
@@ -5,0 +5,0 @@ "main": "index.js", |
@@ -5,2 +5,4 @@ const Assert = require('assert'); | ||
const named_handler = () => {}; | ||
it('attaches a handler to an event', function() { | ||
@@ -17,2 +19,12 @@ es.on('test', () => {}); | ||
it('attaches a named handler to an event', function() { | ||
es.on('test', named_handler); | ||
Assert.strictEqual(es.getHandlersCount('test'), 1); | ||
}); | ||
it('detaches a named handler from an event', function() { | ||
es.off('test', named_handler); | ||
Assert.strictEqual(es.getHandlersCount('test'), 0); | ||
}); | ||
it('attaches a namespaced handler to an event', function() { | ||
@@ -38,2 +50,9 @@ es.on('test.a', () => {}); | ||
it('detaches only namespaced handlers from an event', function() { | ||
es.on('test.a', () => {}); | ||
es.on('test.b', () => {}); | ||
es.off('test', null, false); | ||
Assert.strictEqual(es.getHandlersCount('test'), 2); | ||
}); | ||
it('handles an event many times', function() { | ||
@@ -40,0 +59,0 @@ let v = 0; |
13244
288