Skip to content

Commit eb676fd

Browse files
authored
feat(core): global event handling (NativeScript#8830)
1 parent b3e9339 commit eb676fd

File tree

1 file changed

+35
-25
lines changed

1 file changed

+35
-25
lines changed

packages/core/data/observable/index.ts

Lines changed: 35 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -36,10 +36,8 @@ export class WrappedValue implements WrappedValueDefinition {
3636

3737
const _wrappedValues = [new WrappedValue(null), new WrappedValue(null), new WrappedValue(null), new WrappedValue(null), new WrappedValue(null)];
3838

39-
4039
const _globalEventHandlers = {};
4140

42-
4341
export class Observable implements ObservableDefinition {
4442
public static propertyChangeEvent = 'propertyChange';
4543
public _isViewBase: boolean;
@@ -163,14 +161,14 @@ export class Observable implements ObservableDefinition {
163161
throw new TypeError('callback must be function.');
164162
}
165163

166-
const eventClass = this.name;
164+
const eventClass = this.name === 'Observable' ? '*' : this.name;
167165
if (!_globalEventHandlers[eventClass]) {
168166
_globalEventHandlers[eventClass] = {};
169167
}
170168
if (!Array.isArray(_globalEventHandlers[eventClass][eventName])) {
171169
_globalEventHandlers[eventClass][eventName] = [];
172170
}
173-
_globalEventHandlers[eventClass][eventName].push({callback, thisArg, once: true});
171+
_globalEventHandlers[eventClass][eventName].push({ callback, thisArg, once: true });
174172
}
175173

176174
public static off(eventName: string, callback?: any, thisArg?: any): void {
@@ -186,10 +184,12 @@ export class Observable implements ObservableDefinition {
186184
throw new TypeError('callback must be function.');
187185
}
188186

189-
const eventClass = this.name;
187+
const eventClass = this.name === 'Observable' ? '*' : this.name;
190188

191189
// Short Circuit if no handlers exist..
192-
if (!_globalEventHandlers[eventClass] || !Array.isArray(_globalEventHandlers[eventClass][eventName])) { return; }
190+
if (!_globalEventHandlers[eventClass] || !Array.isArray(_globalEventHandlers[eventClass][eventName])) {
191+
return;
192+
}
193193

194194
const events = _globalEventHandlers[eventClass][eventName];
195195
if (thisArg) {
@@ -221,7 +221,6 @@ export class Observable implements ObservableDefinition {
221221
if (keys.length === 0) {
222222
delete _globalEventHandlers[eventClass];
223223
}
224-
225224
}
226225

227226
public static addEventListener(eventName: string, callback: any, thisArg?: any): void {
@@ -233,41 +232,52 @@ export class Observable implements ObservableDefinition {
233232
throw new TypeError('callback must be function.');
234233
}
235234

236-
const eventClass = this.name;
237-
if (!_globalEventHandlers[eventClass]) {
238-
_globalEventHandlers[eventClass] = {};
239-
}
240-
if (!Array.isArray(_globalEventHandlers[eventClass][eventName])) {
241-
_globalEventHandlers[eventClass][eventName] = [];
242-
}
243-
_globalEventHandlers[eventClass][eventName].push({callback, thisArg});
235+
const eventClass = this.name === 'Observable' ? '*' : this.name;
236+
if (!_globalEventHandlers[eventClass]) {
237+
_globalEventHandlers[eventClass] = {};
238+
}
239+
if (!Array.isArray(_globalEventHandlers[eventClass][eventName])) {
240+
_globalEventHandlers[eventClass][eventName] = [];
241+
}
242+
_globalEventHandlers[eventClass][eventName].push({ callback, thisArg });
244243
}
245244

246-
public notify<T extends EventData>(data: T): void {
247-
const eventClass = this.constructor.name;
245+
private _globalNotify<T extends EventData>(eventClass: string, eventType: string, data: T): void {
246+
// Check for the Global handlers for JUST this class
248247
if (_globalEventHandlers[eventClass]) {
249-
const event = data.eventName + "First";
248+
const event = data.eventName + eventType;
250249
const events = _globalEventHandlers[eventClass][event];
251250
if (events) {
252251
Observable._handleEvent(events, data);
253252
}
254253
}
255254

255+
// Check for he Global handlers for ALL classes
256+
if (_globalEventHandlers['*']) {
257+
const event = data.eventName + eventType;
258+
const events = _globalEventHandlers['*'][event];
259+
if (events) {
260+
Observable._handleEvent(events, data);
261+
}
262+
}
263+
}
264+
265+
public notify<T extends EventData>(data: T): void {
266+
const eventClass = this.constructor.name;
267+
this._globalNotify(eventClass, 'First', data);
268+
256269
const observers = <Array<ListenerEntry>>this._observers[data.eventName];
257270
if (observers) {
258271
Observable._handleEvent(observers, data);
259272
}
260273

261-
if (_globalEventHandlers[eventClass]) {
262-
const events = _globalEventHandlers[eventClass][data.eventName];
263-
if (events) {
264-
Observable._handleEvent(events, data);
265-
}
266-
}
274+
this._globalNotify(eventClass, '', data);
267275
}
268276

269277
private static _handleEvent<T extends EventData>(observers: Array<ListenerEntry>, data: T): void {
270-
if (!observers) { return; }
278+
if (!observers) {
279+
return;
280+
}
271281
for (let i = observers.length - 1; i >= 0; i--) {
272282
const entry = observers[i];
273283
if (entry.once) {

0 commit comments

Comments
 (0)