Событие двойного щелчка с mapbox gl

Я перерисовываю слои в событии style.load и удаляю слои

        map.on('style.load', function() {
           loadByBounds(tempBounds)              
        });

        function loadByBounds(b) {
          if (map.getLayer("cluster-count")) {
            map.removeLayer("cluster-count");
          }
          ...
          map.on('click', 'unclustered-point', function(e) {

            var popup = new mapboxgl.Popup()
              .setLngLat(e.features[0].geometry.coordinates)
              .setHTML(text)
              .addTo(map);
          })}

Но как удалить события map.on ('click')? Когда я щелкаю по точке, Popup () отображается 2 раза. И когда я меняю слой еще раз, событие onclick срабатывает 3 раза и так далее. Итак, я думаю, что мне нужно удалить событие щелчка, но как? Спасибо


person SERG    schedule 13.08.2017    source источник


Ответы (1)


Возможно, вы захотите использовать map.once(). Это добавит слушателя, который будет вызываться только один раз для указанного типа события. Однако после запуска события 1 щелчка этот прослушиватель событий не будет прослушивать дальнейшие события щелчка.

https://www.mapbox.com/mapbox-gl-js/api/#evented#once

С map.off() он в основном противоположен map.on(), и вы можете использовать его для отмены регистрации любых примененных прослушивателей событий. Однако вам нужно будет добавить прослушиватели событий без анонимной функции, чтобы использовать map.off().

https://www.mapbox.com/mapbox-gl-js/api/#map#off

// you would need to use a named function
  function clickHandler(e) {
    // handle click
  }

  map.on('click', clickHandler);
// then you can use 
  map.off('click', clickHandler);
  
// With an anonymous function you won't be able to use map.off
  map.on('click', (e) => {
    // handle click
  });

Чтобы ваше приложение не регистрировало несколько слушателей, вам, возможно, потребуется установить флаг, который устанавливается после применения вашего первого слушателя событий.

let notListening = true;

function loadByBounds(b) {
  // ....
  if (notListening) {
    notListening = false;
    map.on('click', (e) => { 
      // do something 
    });
  }
}

person Andi-lo    schedule 13.08.2017