Leaflet 使用ScalaJS+;时未捕获到地图单击事件;阿克卡

Leaflet 使用ScalaJS+;时未捕获到地图单击事件;阿克卡,leaflet,akka,scala.js,Leaflet,Akka,Scala.js,我正在开发一个ScalaJS+Akka网络应用程序,它使用传单JS显示地图。这一切都很好,除了当我试图捕捉地图的点击事件时 创建地图和添加平铺层都很有效: def worldMap(mapDiv: String): LMap = { // Show map of whole world val mapRef = L.map(mapDiv, LMapOptions.zoom(worldZoomLevel).center(startPos)) // Add click event ha

我正在开发一个ScalaJS+Akka网络应用程序,它使用传单JS显示地图。这一切都很好,除了当我试图捕捉地图的
点击事件时

创建地图和添加平铺层都很有效:

def worldMap(mapDiv: String): LMap = {
  // Show map of whole world
  val mapRef = L.map(mapDiv, LMapOptions.zoom(worldZoomLevel).center(startPos))

  // Add click event handler to map
  mapRef.on("click", (msg: dom.MouseEvent) => StageManager.countryMapActor ! msg)

  val queryStr = (
    for (p <- mbQueryParams.keys)
      yield s"$p=${mbQueryParams.get(p).get}"
    ).mkString("?", "&", "")

  // Add map tile layer
  L.tileLayer(
    mapBoxEndpoint + queryStr,
    TileLayerOptions.
      id("mapbox.streets").
      maxZoom(19).
      attribution(
        """Map data &copy; <a href="http://openstreetmap.org">OpenStreetMap</a> contributors,
          |<a href="http://creativecommons.org/licenses/by-sa/2.0/">CC-BY-SA</a>,
          |Imagery © <a href="http://mapbox.com">Mapbox</a>""".stripMargin)
  ).addTo(mapRef)

  mapRef
}
编译并运行良好,但从未调用侦听此事件的相应Akka actor

侦听此事件的参与者包含以下内容:

class CountryMapActor extends Actor {
  def receive = {
    // SNIP
    case evt: MouseEvent =>
      if (evt.hasOwnProperty("latlng")) {
        // do something with lat/lng...
      }
  }
}
但无论我使用的是
dom.Event
还是
dom.MouseEvent
,都不会收到此消息

我已尝试将事件类型更改为
mouseevent
(根据),但是上面的
receive
方法无法编译,错误消息为
isInstanceOf[com.felstar.scalajs.mouseevent]不受支持,因为它是原始JS特征

我不想在地图上添加标记,因为关键是用户可以单击地图上的任何位置来检索有关该位置的信息

你知道如何通过ScalaJS获取地图点击事件吗

谢谢


Chris W

最有可能的事件名称应该是
“click”
,而不是
“onclick”
好的,解决了它

首先,为了能够提取相关的地理信息,添加到Map对象的click事件处理程序函数必须采用类型为
MouseEvent
的参数

事件名称为
click
,可以硬编码,也可以使用
LMapEvent.click.toString
获得更可靠的事件名称

mapRef.on(LMapEvent.click.toString, (evt: LeafletMouseEvent) =>
  StageManager.countryMapActor ! MessageBox.MapClick(new MapLocation(evt.latlng))
)
其次,
mouseevent
类型的事件对象不能直接作为消息发送给Akka参与者,因为它只是一个特征。 因此,必须首先将相关数据从事件对象卸载到某个具体类的实例中(在我的例子中,我刚刚编写了一个名为
MapLocation

最后,侦听此消息的Akka参与者接收类型为
MapLocation
的消息,而不是某种事件类型的消息。在我的例子中,各种参与者使用的所有消息都被定义为名为
MessageBox
的对象中的一组case类;因此,在上面的代码中,我发送了一条类型为
MessageBox.MapClick(newmapplocation(evt.latlng))

现在一切都好了


顺便说一句,我使用的façcade传单是由

谢谢提供的,但我尝试使用事件名称
单击
,但没有任何效果。我将编辑原始帖子以反映这一点。
mapRef.on(LMapEvent.click.toString, (evt: LeafletMouseEvent) =>
  StageManager.countryMapActor ! MessageBox.MapClick(new MapLocation(evt.latlng))
)
class MapLocation(latlng: leaflet.LatLng) {
  val lat:Double = latlng.lat
  val lng:Double = latlng.lng
}