aurelia-dragula
Version:
An aurelia compatible version of Dragula
66 lines (56 loc) • 1.36 kB
JavaScript
// let debounce = require('./debounce')
class EventListener {
constructor (func, once = false) {
this.func = func
this.once = once
}
}
export class Emitter {
constructor () {
this.events = {}
}
on (type, fn, once = false) {
let newEvent = new EventListener(fn, once)
if (this.events[type] === undefined) {
this.events[type] = []
}
this.events[type].push(newEvent)
}
once (type, fn) {
this.on(type, fn, true)
}
off (type, fn) {
if (arguments.length === 1) {
delete this.events[type]
} else if (arguments.length === 0) {
this.events = {}
} else {
let eventList = this.events[type]
if (eventList) {
let index = eventList.findIndex(x => x.func === fn)
if (index >= 0) {
eventList.splice(index, 1)
}
}
}
}
destroy () {
this.events = {}
}
emit () {
let args = arguments ? [...arguments] : []
let type = args.shift()
let et = (this.events[type] || []).slice(0)
if (type === 'error' && !et.length) { throw args.length === 1 ? args[0] : args }
let toDeregister = []
et.forEach(listener => {
listener.func(...args)
if (listener.once) {
toDeregister.push(listener)
}
})
toDeregister.forEach(listener => {
this.off(type, listener.func)
})
}
}