Фон:
В mapbox-gl-js
, хотя вы можете удалять слои и объекты с карты (поскольку ссылки сохранены), вы не можете сделать то же самое с маркерами . Вместо этого нужно сохранить ссылку на любой добавленный маркер, иначе он не сможет удалить их позже.
var marker = new mapboxgl.Marker().addTo(map);
marker.remove();
Настройка:
У меня есть атом, где я добавляю каждый созданный маркер, чтобы потом можно было их очистить.
(defonce markers (r/atom []))
(defn add-marker [map img coordinate]
(let [marker (create-marker img)]
(.setLngLat marker (clj->js coordinate))
(.addTo marker map)
(swap! markers conj marker)))
(defn clear-markers []
(doseq [m (array-seq markers)] (.remove m))
(reset! markers []))
Однако если я позвоню clear-markers
, ничего не произойдет. Без ошибок, без предупреждений, маркер просто остается на карте.
Если я удаляю маркер сразу после добавления (просто чтобы попробовать его), он работает, как описано в документации:
(defn test-marker [map img coordinate]
(let [marker (create-marker img)]
(.setLngLat marker (clj->js coordinate))
(.addTo marker map)
(.remove marker)))
Очевидно, что с этим кодом маркер будет удален сразу после добавления и, следовательно, никогда не будет на карте, что не является желаемым поведением, просто тест.
Я также пробовал другие подходы к тому, как позвоните .remove
на элементы вектора, моя первая попытка была следующей:
(defn clear-markers []
(map #(.remove %) markers))
Я довольно новичок в Clojure (Script), поэтому я пытаюсь понять, где моя ошибка.
- Может быть, объект в моем векторе не тот же экземпляр, поэтому удаление его не повлияет на маркер на карте?
- Или я должен использовать другой подход, когда пытаясь выполнить побочные методы на объектах в векторе?
- Или я что-то совсем упустил?