@@ -19,6 +19,7 @@ import {
19
19
import { init as initChart } from "echarts/core" ;
20
20
import {
21
21
EChartsType ,
22
+ EventTarget ,
22
23
Option ,
23
24
Theme ,
24
25
ThemeInjection ,
@@ -116,23 +117,52 @@ export default defineComponent({
116
117
. forEach ( key => {
117
118
// onClick -> c + lick
118
119
// onZr:click -> z + r:click
119
- const event = key . charAt ( 2 ) . toLowerCase ( ) + key . slice ( 3 ) ;
120
+ let event = key . charAt ( 2 ) . toLowerCase ( ) + key . slice ( 3 ) ;
121
+
122
+ // clickOnce -> ~click
123
+ // zr:clickOnce -> ~zr:click
124
+ if ( event . substring ( event . length - 4 ) === "Once" ) {
125
+ event = `~${ event . substring ( 0 , event . length - 4 ) } ` ;
126
+ }
127
+
120
128
realListeners [ event ] = attrs [ key ] ;
121
129
} ) ;
122
130
}
123
131
124
132
Object . keys ( realListeners ) . forEach ( key => {
125
- const handler = realListeners [ key ] as any ;
133
+ let handler = realListeners [ key ] ;
126
134
127
135
if ( ! handler ) {
128
136
return ;
129
137
}
130
138
131
- if ( key . indexOf ( "zr:" ) === 0 ) {
132
- instance . getZr ( ) . on ( key . slice ( 3 ) . toLowerCase ( ) , handler ) ;
133
- } else {
134
- instance . on ( key . toLowerCase ( ) , handler ) ;
139
+ let event = key . toLowerCase ( ) ;
140
+ if ( event . charAt ( 0 ) === "~" ) {
141
+ event = event . substring ( 1 ) ;
142
+ handler . __once__ = true ;
135
143
}
144
+
145
+ let target : EventTarget = instance ;
146
+ if ( event . indexOf ( "zr:" ) === 0 ) {
147
+ target = instance . getZr ( ) ;
148
+ event = event . substring ( 3 ) ;
149
+ }
150
+
151
+ if ( handler . __once__ ) {
152
+ delete handler . __once__ ;
153
+
154
+ const raw = handler ;
155
+
156
+ handler = ( ...args : any [ ] ) => {
157
+ raw ( ...args ) ;
158
+ target . off ( event , handler ) ;
159
+ } ;
160
+ }
161
+
162
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
163
+ // @ts -ignore EChartsType["on"] is not compatible with ZRenderType["on"]
164
+ // but it's okay here
165
+ target . on ( event , handler ) ;
136
166
} ) ;
137
167
138
168
function resize ( ) {
0 commit comments