@@ -23,7 +23,7 @@ export abstract class Node {
23
23
/** @internal */
24
24
protected _visible : boolean ;
25
25
/** @internal */
26
- protected _listeners : Record < string , ( params : any ) => void > ;
26
+ protected _listeners : Record < string , ( ( params : any ) => void ) [ ] > ;
27
27
/** @internal */
28
28
protected _dirty : boolean = false ;
29
29
/** @internal */
@@ -83,14 +83,38 @@ export abstract class Node {
83
83
return Orientation . flip ( this . _parent . getOrientation ( ) ) ;
84
84
}
85
85
}
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
+ }
90
99
}
91
100
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
+ }
94
118
}
95
119
96
120
abstract toJson ( ) : IJsonRowNode | IJsonBorderNode | IJsonTabSetNode | IJsonTabNode | undefined ;
@@ -104,7 +128,9 @@ export abstract class Node {
104
128
_fireEvent ( event : string , params : any ) {
105
129
// console.log(this._type, " fireEvent " + event + " " + JSON.stringify(params));
106
130
if ( this . _listeners [ event ] !== undefined ) {
107
- this . _listeners [ event ] ( params ) ;
131
+ for ( const callback of this . _listeners [ event ] ) {
132
+ callback ( params ) ;
133
+ }
108
134
}
109
135
}
110
136
0 commit comments