cljs中的MapBox:从地图中删除标记(将标记存储在原子中之后)

问题描述 投票:0回答:1

背景:

mapbox-gl-js中,虽然您可以从地图中删除图层和要素(因为已存储参考),但是you cannot do the same with markers。相反,必须存储对添加的任何标记的引用,否则,以后将无法删除它们。

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)的新手,所以我尝试了解我的错误在哪里。

  • 向量中的对象是否可能不是同一实例,因此将其删除不会影响地图上的标记吗?
  • 或者当试图对向量中的对象执行副作用方法时,是否必须执行其他方法?
  • 或者我是否完全想念其他东西?
clojurescript mapbox-gl-js clojurescript-javascript-interop
1个回答
0
投票

快速猜测,请尝试在此处用map替换doseq

(defn clear-markers []
  (doseq #(.remove %) @markers))

map函数是惰性的,只有在需要时才运行。由于您似乎有去除标记的副作用,因此doseq是正确的选择。它旨在产生副作用,并且始终可以立即运行。它总是返回nil

此外,您需要解引用markers以获得向量,然后仅在doseq中使用它。不要使用array-seq,因为该原子存储的是普通的Clojure / Script向量,而不是JS数组。

© www.soinside.com 2019 - 2024. All rights reserved.