UNPKG

3.4 kBJavaScriptView Raw
1import Emitter from '../emitter';
2import define from '../define';
3import * as is from '../is';
4import Selector from '../selector';
5
6let emitterOptions = {
7 qualifierCompare: function( selector1, selector2 ){
8 if( selector1 == null || selector2 == null ){
9 return selector1 == null && selector2 == null;
10 } else {
11 return selector1.sameText( selector2 );
12 }
13 },
14 eventMatches: function( ele, listener, eventObj ){
15 let selector = listener.qualifier;
16
17 if( selector != null ){
18 return ele !== eventObj.target && is.element( eventObj.target ) && selector.matches( eventObj.target );
19 }
20
21 return true;
22 },
23 addEventFields: function( ele, evt ){
24 evt.cy = ele.cy();
25 evt.target = ele;
26 },
27 callbackContext: function( ele, listener, eventObj ){
28 return listener.qualifier != null ? eventObj.target : ele;
29 },
30 beforeEmit: function( context, listener/*, eventObj*/ ){
31 if( listener.conf && listener.conf.once ){
32 listener.conf.onceCollection.removeListener( listener.event, listener.qualifier, listener.callback );
33 }
34 },
35 bubble: function(){
36 return true;
37 },
38 parent: function( ele ){
39 return ele.isChild() ? ele.parent() : ele.cy();
40 }
41};
42
43let argSelector = function( arg ){
44 if( is.string(arg) ){
45 return new Selector( arg );
46 } else {
47 return arg;
48 }
49};
50
51let elesfn = ({
52 createEmitter: function(){
53 for( let i = 0; i < this.length; i++ ){
54 let ele = this[i];
55 let _p = ele._private;
56
57 if( !_p.emitter ){
58 _p.emitter = new Emitter( emitterOptions, ele );
59 }
60 }
61
62 return this;
63 },
64
65 emitter: function(){
66 return this._private.emitter;
67 },
68
69 on: function( events, selector, callback ){
70 let argSel = argSelector(selector);
71
72 for( let i = 0; i < this.length; i++ ){
73 let ele = this[i];
74
75 ele.emitter().on( events, argSel, callback );
76 }
77
78 return this;
79 },
80
81 removeListener: function( events, selector, callback ){
82 let argSel = argSelector(selector);
83
84 for( let i = 0; i < this.length; i++ ){
85 let ele = this[i];
86
87 ele.emitter().removeListener( events, argSel, callback );
88 }
89
90 return this;
91 },
92
93 removeAllListeners: function(){
94 for( let i = 0; i < this.length; i++ ){
95 let ele = this[i];
96
97 ele.emitter().removeAllListeners();
98 }
99
100 return this;
101 },
102
103 one: function( events, selector, callback ){
104 let argSel = argSelector(selector);
105
106 for( let i = 0; i < this.length; i++ ){
107 let ele = this[i];
108
109 ele.emitter().one( events, argSel, callback );
110 }
111
112 return this;
113 },
114
115 once: function( events, selector, callback ){
116 let argSel = argSelector(selector);
117
118 for( let i = 0; i < this.length; i++ ){
119 let ele = this[i];
120
121 ele.emitter().on( events, argSel, callback, {
122 once: true,
123 onceCollection: this
124 } );
125 }
126 },
127
128 emit: function( events, extraParams ){
129 for( let i = 0; i < this.length; i++ ){
130 let ele = this[i];
131
132 ele.emitter().emit( events, extraParams );
133 }
134
135 return this;
136 },
137
138 emitAndNotify: function( event, extraParams ){ // for internal use only
139 if( this.length === 0 ){ return; } // empty collections don't need to notify anything
140
141 // notify renderer
142 this.cy().notify( event, this );
143
144 this.emit( event, extraParams );
145
146 return this;
147 }
148});
149
150define.eventAliasesOn( elesfn );
151
152export default elesfn;