12
12
- this.rb.events.emit(elm, 'event' [, { detail: any } ]); :boolean
13
13
********************************************************************************/
14
14
import Guid from '../../public/services/guid.js' ;
15
+ import Type from '../../public/services/type.js' ;
15
16
16
17
/* Event Helpers
17
18
****************/
@@ -107,6 +108,14 @@ const EventHelper = {
107
108
108
109
// bound functions are prefixed with 'bound '
109
110
return callback . name . replace ( / ^ b o u n d / , '' ) ;
111
+ } ,
112
+ setHostEvent ( hostEvents , evt , func , opts = { } ) { // :void
113
+ hostEvents [ evt ] = {
114
+ pending : false ,
115
+ func : func . bind ( this ) // by default bind to rb-component
116
+ }
117
+ if ( ! opts . clear ) return ;
118
+ this [ opts . onEvt ] = null ; // nullify when onevent is declared in html
110
119
}
111
120
} ;
112
121
@@ -116,6 +125,7 @@ const EventService = function() { // :object (this = rb-component)
116
125
/* Private
117
126
**********/
118
127
let _events = { } ;
128
+ let _hostEvents = { } ;
119
129
120
130
/* Public
121
131
*********/
@@ -175,6 +185,58 @@ const EventService = function() { // :object (this = rb-component)
175
185
const evtOpts = Object . assign ( { } , EventHelper . customEvtDefaults , opts ) ;
176
186
const evtObj = new CustomEvent ( evt , evtOpts ) ;
177
187
return target . dispatchEvent ( evtObj ) ;
188
+ } ,
189
+ /* Host Events
190
+ **************/
191
+ host : {
192
+ get events ( ) { // :object (readonly: hashmap of host events)
193
+ return _hostEvents ;
194
+ } ,
195
+ add : ( events = [ ] ) => { // :void (usually ran in component constructor)
196
+ if ( ! events . length ) return ; // ex: ['click','focus']
197
+ for ( const evt of events ) {
198
+ const onEvt = `on${ evt } ` ; // ex: onclick
199
+ if ( this . hasAttribute ( onEvt ) )
200
+ EventHelper . setHostEvent . call ( this , _hostEvents , evt , this [ onEvt ] , {
201
+ onEvt,
202
+ clear : true
203
+ } ) ;
204
+ // dynamic getters and setters
205
+ Object . defineProperty ( this , onEvt , {
206
+ get ( ) { // :object
207
+ return _hostEvents [ evt ] ;
208
+ } ,
209
+ set ( func ) {
210
+ EventHelper . setHostEvent . call ( this , _hostEvents , evt , func ) ;
211
+ }
212
+ } ) ;
213
+ }
214
+ } ,
215
+ remove : ( events = [ ] ) => { // :void
216
+ if ( ! events . length ) return ;
217
+ for ( const evt of events )
218
+ delete _hostEvents [ evt ] ;
219
+ } ,
220
+ removeAll : ( ) => { // :void
221
+ _hostEvents = { } ;
222
+ } ,
223
+ run : async evt => { // :any (evt :object<event>)
224
+ const hostEvent = _hostEvents [ evt . type ] ;
225
+ if ( ! hostEvent ) return ;
226
+ if ( hostEvent . pending ) return ;
227
+ if ( ! Type . is . function ( hostEvent . func ) ) return ;
228
+ hostEvent . pending = true ;
229
+ const result = await hostEvent . func ( evt ) ;
230
+ hostEvent . pending = false ;
231
+ return result ;
232
+ } ,
233
+ isPending : evt => { // :boolean (evt :object<event> | string<eventType>)
234
+ if ( ! evt ) return false ;
235
+ if ( Type . is . object ( evt ) ) evt = evt . type ;
236
+ const hostEvent = _hostEvents [ evt ] ;
237
+ if ( ! hostEvent ) return false ;
238
+ return hostEvent . pending ;
239
+ }
178
240
}
179
241
} ;
180
242
} ;
0 commit comments