@antv/x6
Version:
JavaScript diagramming library that uses SVG and HTML for rendering.
87 lines • 2.64 kB
JavaScript
import { FunctionExt } from '../util';
export class Events {
constructor() {
this.listeners = {};
}
on(name, handler, context) {
if (handler == null) {
return this;
}
if (!this.listeners[name]) {
this.listeners[name] = [];
}
const cache = this.listeners[name];
cache.push(handler, context);
return this;
}
once(name, handler, context) {
const cb = (...args) => {
this.off(name, cb);
return Private.call([handler, context], args);
};
return this.on(name, cb, this);
}
off(name, handler, context) {
// remove all events.
if (!(name || handler || context)) {
this.listeners = {};
return this;
}
const listeners = this.listeners;
const names = name ? [name] : Object.keys(listeners);
names.forEach((n) => {
const cache = listeners[n];
if (!cache) {
return;
}
// remove all events with specified name.
if (!(handler || context)) {
delete listeners[n];
return;
}
for (let i = cache.length - 2; i >= 0; i -= 2) {
if (!((handler && cache[i] !== handler) ||
(context && cache[i + 1] !== context))) {
cache.splice(i, 2);
}
}
});
return this;
}
trigger(name, ...args) {
let returned = true;
if (name !== '*') {
const list = this.listeners[name];
if (list != null) {
returned = Private.call([...list], args);
}
}
const list = this.listeners['*'];
if (list != null) {
return FunctionExt.toAsyncBoolean([
returned,
Private.call([...list], [name, ...args]),
]);
}
return returned;
}
emit(name, ...args) {
return this.trigger(name, ...args);
}
}
var Private;
(function (Private) {
function call(list, args) {
const results = [];
for (let i = 0; i < list.length; i += 2) {
const handler = list[i];
const context = list[i + 1];
const params = Array.isArray(args) ? args : [args];
const ret = FunctionExt.apply(handler, context, params);
results.push(ret);
}
return FunctionExt.toAsyncBoolean(results);
}
Private.call = call;
})(Private || (Private = {}));
//# sourceMappingURL=events.js.map