Включение\выключение слоев на Yandex картах

Добрый день народ есть функция которая при клике создает некоторые действие, но когда нажимаю второй раз ничего не происходить
Потом еще раз нажимаю снова происходит действие что и первый раз
Как сделать что бы пропадал результат функцию при нажимании первый раз на неё

function Swipe() {
  var ctrl = new ol.control.Swipe();
  if (window.isSwipe) {
    window.isSwipe = false;
    map.removeControl(ctrl);
    ctrl.removeLayer(osm, true);
    ctrl.removeLayer(stamen);
  } else {
    window.isSwipe = true;
    map.addControl(ctrl);
    ctrl.addLayer(osm, true);
    ctrl.addLayer(stamen);
  }
}

Описание задачи очень расплывчато, поэтому я мог неверно ее понять. Но попробую ответить.

Функция Swipe реализована так что при одном вызове она что-то добавляет, при следующем она что-то удаляет, при последующем добавляет, следующем удаляет.

Решение будет в том чтобы при каждом вызове удалять и добавлять одновременно. Тут могут быть нюансы, которые зависят от твоей (давай на ты сразу) реализцации. Например при первом вызове будет нечего удалять. Эти правки уже делай самостоятельно. Решение будет выглядеть как-то так.

function Swipe() {
  var ctrl = new ol.control.Swipe();
  map.removeControl(ctrl);
  ctrl.removeLayer(osm, true);
  ctrl.removeLayer(stamen);
  map.addControl(ctrl);
  ctrl.addLayer(osm, true);
  ctrl.addLayer(stamen);
}

Вообще ситуация чувствуется очень неправильной. При втором клике удаляется нечто ctrl.removeLayer(osm, true);. А тебе, похоже нужно повторить side effect от добавления этого ctrl.addLayer(osm, true);. Должен быть боле простой способ добиться желаемого эффекта. Мое решение если и будет работать то будет неоптимальным, может даже тормозным.

Всеравно оно не удаляет старый вызов функции а создает еще один и еще один


Возможно я не правильно вызываю функцию?

<input class="push" value="Push me" onclick="Swipe()" type="button">

Давай разберемся с задачей. Нужно добавлять некоторый слой на карту при клике, убирать его при втором клике. Так?

И слои и элемент контроля “Swipe” он делит карту на две части с разными шарами, могу скинуть его код js если нужно

Принцип работы контролов такой, что нужно иметь ссылку на объект контрола чтобы мочь его удалить. Оригинальная функция не работала корректно потому что при ее вызове каждый раз создавался объект контрола swipe (переменная ctrl). При этом osm и stamen, похоже уже объявлены вне функции и функция работает с ними по ссылке.

Тебе нужно вынести ctrl за пределы функции Swipe так же как и osm и stamen. Как-то так

var ctrl = new ol.control.Swipe();
function Swipe() {
  if (window.isSwipe) {
    window.isSwipe = false;
    map.removeControl(ctrl);
    ctrl.removeLayer(osm, true);
    ctrl.removeLayer(stamen);
  } else {
    window.isSwipe = true;
    map.addControl(ctrl);
    ctrl.addLayer(osm, true);
    ctrl.addLayer(stamen);
  }
}
1 лайк

Спасибо большое, получилось