Skip to content

Commit 03e4c09

Browse files
setEventListener supports adding multiple event listeners.
1 parent 88cbbf5 commit 03e4c09

File tree

2 files changed

+55
-14
lines changed

2 files changed

+55
-14
lines changed

src/model/Node.ts

Lines changed: 34 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ export abstract class Node {
2323
/** @internal */
2424
protected _visible: boolean;
2525
/** @internal */
26-
protected _listeners: Record<string, (params: any) => void>;
26+
protected _listeners: Record<string, ((params: any) => void)[]>;
2727
/** @internal */
2828
protected _dirty: boolean = false;
2929
/** @internal */
@@ -83,14 +83,38 @@ export abstract class Node {
8383
return Orientation.flip(this._parent.getOrientation());
8484
}
8585
}
86-
87-
// event can be: resize, visibility, maximize (on tabset), close
88-
setEventListener(event: string, callback: (params: any) => void) {
89-
this._listeners[event] = callback;
86+
87+
/**
88+
* Adds the given event listener. Can optionally replace existing listeners.
89+
* @param event valid events: resize, visibility, maximize (on tabset), close
90+
* @param callback
91+
* @param replace if set to true, existing listeners will be cleared
92+
*/
93+
setEventListener(event: string, callback: (params: any) => void, replace:boolean=true) {
94+
if (replace || this._listeners[event] === undefined) {
95+
this._listeners[event] = [callback];
96+
} else {
97+
this._listeners[event].push(callback);
98+
}
9099
}
91100

92-
removeEventListener(event: string) {
93-
delete this._listeners[event];
101+
/**
102+
* If a callback is provided, it will be removed from the event.
103+
* If no callback is provided, all callbacks will be removed from the event.
104+
* @param event valid events: resize, visibility, maximize (on tabset), close
105+
* @param callback the specific callback to remove
106+
*/
107+
removeEventListener(event: string, callback?: (params: any) => void) {
108+
if (callback) {
109+
if (this._listeners[event] !== undefined) {
110+
const index = this._listeners[event].indexOf(callback);
111+
if (index !== -1) {
112+
this._listeners[event].splice(index, 1);
113+
}
114+
}
115+
} else {
116+
this._listeners[event] = [];
117+
}
94118
}
95119

96120
abstract toJson(): IJsonRowNode | IJsonBorderNode | IJsonTabSetNode | IJsonTabNode | undefined;
@@ -104,7 +128,9 @@ export abstract class Node {
104128
_fireEvent(event: string, params: any) {
105129
// console.log(this._type, " fireEvent " + event + " " + JSON.stringify(params));
106130
if (this._listeners[event] !== undefined) {
107-
this._listeners[event](params);
131+
for(const callback of this._listeners[event]) {
132+
callback(params);
133+
}
108134
}
109135
}
110136

test/Model.test.ts

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -504,17 +504,32 @@ describe("Tree", function () {
504504
});
505505

506506
it("close tab", () => {
507-
let closed = false;
508-
tab("/ts0/t0").setEventListener("close", () => { closed = true; })
507+
let closed1 = false;
508+
let closed2 = false;
509+
let closed3 = false;
510+
let closed4 = false;
511+
tab("/ts0/t0").setEventListener("close", () => { closed1 = true; }, false);
512+
tab("/ts0/t0").setEventListener("close", () => { closed2 = true; });
513+
tab("/ts0/t0").setEventListener("close", () => { closed3 = true; }, false);
514+
const close4Callback = () => { closed4 = true; }
515+
tab("/ts0/t0").setEventListener("close", close4Callback, false);
516+
tab("/ts0/t0").removeEventListener("close", close4Callback);
509517
doAction(Actions.deleteTab(tab("/ts0/t0").getId()));
510-
expect(closed).equals(true);
518+
expect(closed1).equals(false);
519+
expect(closed2).equals(true);
520+
expect(closed3).equals(true);
521+
expect(closed4).equals(false);
511522
});
512523

513524
it("save tab", () => {
514-
let saved = false;
515-
tab("/ts0/t0").setEventListener("save", () => { saved = true; })
525+
let saved1 = false;
526+
let saved2 = false;
527+
tab("/ts0/t0").setEventListener("save", () => { saved1 = true; });
528+
tab("/ts0/t0").removeEventListener("save");
529+
tab("/ts0/t0").setEventListener("save", () => { saved2 = true; }, false);
516530
model.toJson();
517-
expect(saved).equals(true);
531+
expect(saved1).equals(false);
532+
expect(saved2).equals(true);
518533
});
519534

520535
it("visibility tab", () => {

0 commit comments

Comments
 (0)