我正在使用Leaflet和scalajs-leaflet facade在Binding.scala上,但地图初始化/出现不正确。
为了重现此问题,我已准备好类似于scalajs-leaflet中的
首先,从https://github.com/mcku/scalajs-leaflet下载分叉的scalajs-leaflet。
在
在浏览器中打开http://localhost:12345/example/target/scala-2.12/classes/leaflet2binding-dev.html。
问题是地图容器出现,但内容(瓷砖等)不正确。在窗口上进行小调整后,地图变得正常,这会触发leaflet的
任何想法?这是binding.scala特定的问题,但也可能是一个leaflet问题。 编辑 可能的解决方法 看起来,地图元素在过程中没有可用的
如果以像素为单位指定样式宽度,则可以正常工作。
为了重现此问题,我已准备好类似于scalajs-leaflet中的
lihaoyi/workbench
页面。首先,从https://github.com/mcku/scalajs-leaflet下载分叉的scalajs-leaflet。
在
scalajs-leaflet
目录中运行sbt
。
在sbt中输入~ example/fastOptJS
。现在,一个Web服务器在端口12345启动。在浏览器中打开http://localhost:12345/example/target/scala-2.12/classes/leaflet2binding-dev.html。
问题是地图容器出现,但内容(瓷砖等)不正确。在窗口上进行小调整后,地图变得正常,这会触发leaflet的
_onResize
处理程序。
容器位于Leaflet2Binding.scala
文件中,在初始化之前已经指定了其大小:
val mapElement = <div id="mapid" style="width: 1000px; height: 600px;
position: relative; outline: currentcolor none medium;"
class="leaflet-container leaflet-touch leaflet-fade-anim
leaflet-grab leaflet-touch-drag leaflet-touch-zoom"
data:tabindex="0"></div>.asInstanceOf[HTMLElement]
在返回元素之前,在以下行中插入一行lmap.invalidateSize(true)
是可能的https://github.com/mcku/scalajs-leaflet/blob/83b770bc76de450567ababf6c7d2af0700dd58c9/example/src/main/scala/example/Leaflet2Binding.scala#L39,但在这种情况下没有帮助。即在此处:
@dom def renderMap = {
val mapElement = ... (same element as above)
.. some other initializations ..
lmap.invalidateSize(true) // true means, use animation
println("mapElement._leaflet_id " +mapElement.asInstanceOf[js.Dynamic]._leaflet_id) // prints non-null value, makes me think the container is initialized
mapElement
}
任何想法?这是binding.scala特定的问题,但也可能是一个leaflet问题。 编辑 可能的解决方法 看起来,地图元素在过程中没有可用的
clientWidth
属性。这是可以理解的,因为文档还没有“准备好”。然而,css style.width
是可用的,并且可以以像素为单位定义。在这种情况下,可以修补leaflet以在计算期间考虑css样式宽度。如果以像素为单位指定样式宽度,则可以正常工作。
diff --git a/src/map/Map.js b/src/map/Map.js
index b94dd443..6544d7b7 100644
--- a/src/map/Map.js
+++ b/src/map/Map.js
@@ -903,8 +903,9 @@ export var Map = Evented.extend({
getSize: function () {
if (!this._size || this._sizeChanged) {
this._size = new Point(
- this._container.clientWidth || 0,
- this._container.clientHeight || 0);
+
+ this._container.clientWidth || parseInt(this._container.style.width.replace("px",""),10) || 0,^M
+ this._container.clientHeight || parseInt(this._container.style.height.replace("px",""),10) || 0);;^M
this._sizeChanged = false;
}
div
没有定义大小,瓦片将不会加载。如果由于配置中的某些动态因素无法在页面加载时为地图容器指定大小,则可以通过在容器初始化后调用map.invalidateSize()
来解决该问题。 - peeebeeeinvalidateSize()
,不是invalidateResize()
。 - peeebeee_leaflet_id
。请参见编辑中的println
。 - mcku