Leaflet 使用ScalaJS+;时未捕获到地图单击事件;阿克卡
我正在开发一个ScalaJS+Akka网络应用程序,它使用传单JS显示地图。这一切都很好,除了当我试图捕捉地图的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
点击事件时
创建地图和添加平铺层都很有效:
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 © <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
}