调整大小之前,传单地图无法正确显示

时间:2018-12-21 05:45:05

标签: leaflet binding.scala

我在Binding.scala上使用具有scalajs-leaflet外观的Leaflet,并且地图初始化/显示不正确。

为了重现该问题,我准备了一个类似于scalajs-leaflet的lihaoyi/workbench页面。

首先,从https://github.com/mcku/scalajs-leaflet下载分支的scalajs-leaflet

sbt目录中运行scalajs-leaflet。 在sbt中输入~ example/fastOptJS。现在,Web服务器从端口12345启动。

打开 http://localhost:12345/example/target/scala-2.12/classes/leaflet2binding-dev.html在浏览器中

问题是出现了地图容器,但内容(瓷砖等)不正确。在窗口上进行少量调整后,地图会变好,这会触发_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特有的,但也可能是传单问题。 map before resize after resize

编辑可能的解决方法 看起来map元素的clientWidth属性在此过程中不可用。可以理解,因为该文档尚未“就绪”。但是,css style.width可用并且可以以px定义。在这种情况下,可以修补传单以在计算过程中考虑css样式的宽度。

如果以px为单位指定样式宽度,则可以使用。

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;
                }

1 个答案:

答案 0 :(得分:1)

也许lmap.invalidateSize(true)被调用为时过早(DOM未准备好或未重新粉刷)。

确保不会发生这种情况。为了防止这种情况,我将这段代码包装为:

setTimeout(100) {
  lmap.invalidateSize(true)        
}

必须在每次DOM重新绘制后完成。