【问题标题】:Leaflet Popups with Clojurescript带有 Clojurescript 的传单弹出窗口
【发布时间】:2016-05-09 05:38:23
【问题描述】:

我很确定这是一个概念错误,但我不确定我在哪里打错了电话。

按照传单教程,我正在尝试在地图上创建一个弹出窗口。根据教程,这是一个简单的操作

var popup = L.popup();

function onMapClick(e) {
    popup
        .setLatLng(e.latlng)
        .setContent("You clicked the map at " + e.latlng.toString())
        .openOn(mymap);
}

mymap.on('click', onMapClick);

但是,当我将其翻译成 clojurescript 时,我收到以下错误:

未捕获的类型错误:t.openPopup 不是函数

我 100% 肯定我错误地调用了 javascript。我正在执行以下操作:

(defn onMapClick [e]
  (let [popup (js/L.Popup.)]
    (-> popup
        (.setLatLng (.-latlng e))
        (.setContent (str "You clicked the map at " (.-latlng e)))
        (.openOn map))))

然后我称之为:

(.on map "click" onMapClick)

map 的定义正确。 (我说得对,因为我能够绘制多边形并创建与.bindPopup 绑定到这些多边形的弹出窗口)

【问题讨论】:

  • 你试过没有线程宏吗?线程宏假定每次都返回弹出窗口,而这些互操作调用可能并非如此。
  • @ChrisMurphy 不幸的是,(.openOn popup (.setContent (.setLatLng popup (.-latlng e) "You clicked the map at " + (.-latlng e))) map) 产生了同样的错误。
  • 原来我犯了一个超级愚蠢的错误,并且在我定义 map 的范围之外调用了它,并且它被打破了。只需将其包裹在(let [map ..define map..] <code here>)
  • 考虑到 Clojure 没有很好的错误消息并且允许隐藏,这实际上并不是一个可以在任何地方使用的好名字:github.com/bbatsov/clojure-style-guide#dont-shadow-clojure-core
  • @ChrisMurphy 抱歉,这只是为了澄清传单中发生的事情,我已将 (js/L.Map. "the-map") 绑定到 leaflet-mp

标签: leaflet clojurescript


【解决方案1】:

我在考虑完全不依赖返回值。只依赖调用顺序:

(defn onMapClick [e]
  (let [popup (js/L.Popup.)]
    (.setLatLng popup (.-latlng e))
    (.setContent popup (str "You clicked the map at " (.-latlng e)))
    (.openOn popup map)))

如果文档说这些 js setter 函数返回弹出窗口,那么这不会有太大的答案!

您应该能够将问题归结为一个函数调用??

【讨论】:

  • 不幸的是,这会引发同样的错误。查看 Leaflet 代码,它看起来在传递某个对象时返回openPopup,所以我猜我传递给它错误的对象。我会再深入研究一下。
  • 您可以查看已经使用 Leaflet 的 ClojureScript 代码。这是一个可能的资源,如果您还没有找到它:github.com/rururu/rete4flights
猜你喜欢
  • 1970-01-01
  • 2016-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-06
相关资源
最近更新 更多