@@ -21,6 +21,7 @@ export class SimpleStyle {
2121 private geojson ;
2222 private map ;
2323 private options ;
24+ private _eventHandlers : { event : string ; layer : string ; handler : ( ...args ) => void } [ ] = [ ] ;
2425
2526 constructor ( geojson , options ?) {
2627 this . setGeoJSON ( geojson ) ;
@@ -270,7 +271,7 @@ export class SimpleStyle {
270271 }
271272
272273 async setPopup ( map , source ) {
273- map . on ( 'click' , source , async ( e ) => {
274+ const clickHandler = async ( e ) => {
274275 const center = turfCenter ( e . features [ 0 ] ) . geometry . coordinates as [
275276 number ,
276277 number ,
@@ -284,17 +285,27 @@ export class SimpleStyle {
284285 . setHTML ( sanitizedDescription )
285286 . addTo ( map ) ;
286287 }
287- } ) ;
288+ } ;
288289
289- map . on ( 'mouseenter' , source , ( e ) => {
290+ const mouseEnterHandler = ( e ) => {
290291 if ( e . features [ 0 ] . properties . description ) {
291292 map . getCanvas ( ) . style . cursor = 'pointer' ;
292293 }
293- } ) ;
294+ } ;
294295
295- map . on ( 'mouseleave' , source , ( ) => {
296+ const mouseLeaveHandler = ( ) => {
296297 map . getCanvas ( ) . style . cursor = '' ;
297- } ) ;
298+ } ;
299+
300+ map . on ( 'click' , source , clickHandler ) ;
301+ map . on ( 'mouseenter' , source , mouseEnterHandler ) ;
302+ map . on ( 'mouseleave' , source , mouseLeaveHandler ) ;
303+
304+ this . _eventHandlers . push (
305+ { event : 'click' , layer : source , handler : clickHandler } ,
306+ { event : 'mouseenter' , layer : source , handler : mouseEnterHandler } ,
307+ { event : 'mouseleave' , layer : source , handler : mouseLeaveHandler } ,
308+ ) ;
298309 }
299310
300311 /**
@@ -325,9 +336,11 @@ export class SimpleStyle {
325336 } ,
326337 } ) ;
327338
328- this . map . on ( 'click' , `${ this . options . id } -clusters` , async ( e ) => {
339+ const clusterLayer = `${ this . options . id } -clusters` ;
340+
341+ const clusterClickHandler = async ( e ) => {
329342 const features = this . map . queryRenderedFeatures ( e . point , {
330- layers : [ ` ${ this . options . id } -clusters` ] ,
343+ layers : [ clusterLayer ] ,
331344 } ) ;
332345 const clusterId = features [ 0 ] . properties . cluster_id ;
333346 const zoom = await this . map
@@ -338,15 +351,60 @@ export class SimpleStyle {
338351 center : features [ 0 ] . geometry . coordinates ,
339352 zoom : zoom ,
340353 } ) ;
341- } ) ;
354+ } ;
342355
343- this . map . on ( 'mouseenter' , ` ${ this . options . id } -clusters` , ( ) => {
356+ const clusterEnterHandler = ( ) => {
344357 this . map . getCanvas ( ) . style . cursor = 'pointer' ;
345- } ) ;
358+ } ;
346359
347- this . map . on ( 'mouseleave' , ` ${ this . options . id } -clusters` , ( ) => {
360+ const clusterLeaveHandler = ( ) => {
348361 this . map . getCanvas ( ) . style . cursor = '' ;
349- } ) ;
362+ } ;
363+
364+ this . map . on ( 'click' , clusterLayer , clusterClickHandler ) ;
365+ this . map . on ( 'mouseenter' , clusterLayer , clusterEnterHandler ) ;
366+ this . map . on ( 'mouseleave' , clusterLayer , clusterLeaveHandler ) ;
367+
368+ this . _eventHandlers . push (
369+ { event : 'click' , layer : clusterLayer , handler : clusterClickHandler } ,
370+ { event : 'mouseenter' , layer : clusterLayer , handler : clusterEnterHandler } ,
371+ { event : 'mouseleave' , layer : clusterLayer , handler : clusterLeaveHandler } ,
372+ ) ;
373+ }
374+
375+ remove ( ) {
376+ if ( ! this . map ) return this ;
377+ const id = this . options . id ;
378+
379+ for ( const { event, layer, handler } of this . _eventHandlers ) {
380+ this . map . off ( event , layer , handler ) ;
381+ }
382+ this . _eventHandlers = [ ] ;
383+
384+ const layerIds = [
385+ `${ id } -polygon-symbol` ,
386+ `${ id } -linestring-symbol` ,
387+ `${ id } -circle-points` ,
388+ `${ id } -symbol-points` ,
389+ `${ id } -polygon` ,
390+ `${ id } -linestring` ,
391+ `${ id } -clusters` ,
392+ `${ id } -cluster-count` ,
393+ ] ;
394+ for ( const layerId of layerIds ) {
395+ if ( this . map . getLayer ( layerId ) ) {
396+ this . map . removeLayer ( layerId ) ;
397+ }
398+ }
399+ for ( const sourceId of [ id , `${ id } -points` ] ) {
400+ if ( this . map . getSource ( sourceId ) ) {
401+ this . map . removeSource ( sourceId ) ;
402+ }
403+ }
404+
405+ this . map . getCanvas ( ) . style . cursor = '' ;
406+
407+ return this ;
350408 }
351409
352410 setGeoJSON ( geojson ) {
0 commit comments