EventBus.js
3.92 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
/**
* @class Ext.app.EventBus
* @private
*/
Ext.define('Ext.app.EventBus', {
requires: [
'Ext.util.Event',
'Ext.Component'
],
mixins: {
observable: 'Ext.util.Observable'
},
constructor: function() {
this.mixins.observable.constructor.call(this);
this.bus = {};
var me = this;
Ext.override(Ext.Component, {
fireEvent: function(ev) {
if (Ext.util.Observable.prototype.fireEvent.apply(this, arguments) !== false) {
return me.dispatch.call(me, ev, this, arguments);
}
return false;
}
});
},
dispatch: function(ev, target, args) {
var bus = this.bus,
selectors = bus[ev],
selector, controllers, id, events, event, i, ln;
if (selectors) {
// Loop over all the selectors that are bound to this event
for (selector in selectors) {
// Check if the target matches the selector
if (selectors.hasOwnProperty(selector) && target.is(selector)) {
// Loop over all the controllers that are bound to this selector
controllers = selectors[selector];
for (id in controllers) {
if (controllers.hasOwnProperty(id)) {
// Loop over all the events that are bound to this selector on this controller
events = controllers[id];
for (i = 0, ln = events.length; i < ln; i++) {
event = events[i];
// Fire the event!
if (event.fire.apply(event, Array.prototype.slice.call(args, 1)) === false) {
return false;
}
}
}
}
}
}
}
return true;
},
control: function(selectors, listeners, controller) {
var bus = this.bus,
hasListeners, tree, list,
selector, options, listener, scope, event, listenerList, ev;
if (Ext.isString(selectors)) {
selector = selectors;
selectors = {};
selectors[selector] = listeners;
this.control(selectors, null, controller);
return;
}
hasListeners = Ext.util.Observable.HasListeners.prototype;
for (selector in selectors) {
if (selectors.hasOwnProperty(selector)) {
listenerList = selectors[selector] || {};
for (ev in listenerList) {
if (listenerList.hasOwnProperty(ev)) {
options = {};
listener = listenerList[ev];
scope = controller;
event = new Ext.util.Event(controller, ev);
// Normalize the listener
if (Ext.isObject(listener)) {
options = listener;
listener = options.fn;
scope = options.scope || controller;
delete options.fn;
delete options.scope;
}
event.addListener(listener, scope, options);
hasListeners[ev] = 1;
// Create the bus tree if it is not there yet
tree = bus[ev] || (bus[ev] = {});
tree = tree[selector] || (tree[selector] = {});
list = tree[controller.id] || (tree[controller.id] = []);
// Push our listener in our bus
list.push(event);
}
} //end inner loop
}
} //end outer loop
}
});