@@ -19,15 +19,15 @@ export function forwardEventsBuilder(component) {
19
19
const componentOn = component . $on ;
20
20
21
21
// And we override the $on function to forward all bound events.
22
- component . $on = ( fullEventType , ... args ) => {
22
+ component . $on = ( fullEventType , callback ) => {
23
23
let eventType = fullEventType ;
24
24
let destructor = ( ) => { } ;
25
25
if ( $on ) {
26
26
// The event was bound programmatically.
27
- destructor = $on ( eventType ) ;
27
+ destructor = $on ( eventType , callback ) ;
28
28
} else {
29
29
// The event was bound before mount by Svelte.
30
- events . push ( eventType ) ;
30
+ events . push ( [ eventType , callback ] ) ;
31
31
}
32
32
const oldModifierMatch = eventType . match ( oldModifierRegex ) ;
33
33
const newModifierMatch = eventType . match ( newModifierRegex ) ;
@@ -47,7 +47,11 @@ export function forwardEventsBuilder(component) {
47
47
}
48
48
49
49
// Call the original $on function.
50
- const componentDestructor = componentOn . call ( component , eventType , ...args ) ;
50
+ const componentDestructor = componentOn . call (
51
+ component ,
52
+ eventType ,
53
+ callback
54
+ ) ;
51
55
52
56
return ( ...args ) => {
53
57
destructor ( ) ;
@@ -62,11 +66,12 @@ export function forwardEventsBuilder(component) {
62
66
63
67
return ( node ) => {
64
68
const destructors = [ ] ;
69
+ const forwardDestructors = { } ;
65
70
66
71
// This function is responsible for forwarding all bound events.
67
- $on = ( fullEventType ) => {
72
+ $on = ( fullEventType , callback ) => {
68
73
let eventType = fullEventType ;
69
- let handler = forward ;
74
+ let handler = callback ;
70
75
// DOM addEventListener options argument.
71
76
let options = false ;
72
77
const oldModifierMatch = eventType . match ( oldModifierRegex ) ;
@@ -98,6 +103,7 @@ export function forwardEventsBuilder(component) {
98
103
}
99
104
}
100
105
106
+ // Listen for the event directly, with the given options.
101
107
const off = listen ( node , eventType , handler , options ) ;
102
108
const destructor = ( ) => {
103
109
off ( ) ;
@@ -108,12 +114,18 @@ export function forwardEventsBuilder(component) {
108
114
} ;
109
115
110
116
destructors . push ( destructor ) ;
117
+
118
+ // Forward the event from Svelte.
119
+ if ( ! eventType in forwardDestructors ) {
120
+ forwardDestructors [ eventType ] = listen ( node , eventType , forward ) ;
121
+ }
122
+
111
123
return destructor ;
112
124
} ;
113
125
114
126
for ( let i = 0 ; i < events . length ; i ++ ) {
115
127
// Listen to all the events added before mount.
116
- $on ( events [ i ] ) ;
128
+ $on ( events [ i ] [ 0 ] , events [ i ] [ 1 ] ) ;
117
129
}
118
130
119
131
return {
@@ -122,6 +134,11 @@ export function forwardEventsBuilder(component) {
122
134
for ( let i = 0 ; i < destructors . length ; i ++ ) {
123
135
destructors [ i ] ( ) ;
124
136
}
137
+
138
+ // Remove all event forwarders.
139
+ for ( let entry of Object . entries ( forwardDestructors ) ) {
140
+ entry [ 1 ] ( ) ;
141
+ }
125
142
} ,
126
143
} ;
127
144
} ;
0 commit comments