为什么叫小叶的setZoom两次结果在第二被忽略?(Why does calling leaflet

2019-08-18 02:38发布

要重现这个问题,你可以去http://leafletjs.com/和JavaScript控制台,写上如下:

> map.getZoom()
15
> map.setZoom(10);map.setZoom(1);
Object
> map.getZoom()
10

我期待最终的getZoom返回1 。 为什么会出现这种情况? 该问题可能与缩放动画有关。 如果setZoom在动画结束之前调用,它就会被忽略。

我整合传单与emberjs并希望允许外部条件改变变焦变化。 如果用户更改快速放大,效果并不期望的。

Answer 1:

L.Map.setZoom称为L.Map.setView那个叫L.Map._animateZoomIfClose 。 如果map._animatingZoom为真,那么任何变焦停止。 map._animatingZoom工作就像找缩放动画:

  1. 检查在L.Map._animateZoomIfClose如果true停止变焦别人通话L.Map._animateZoom
  2. 设置为trueL.Map._animateZoom并开始CSS过渡。
  3. 设置为false ,在L.Map._onZoomTransitionEnd在CSS过渡结束。

为什么它的作为是什么? 我想是因为它是很难突破的CSS过渡工作。

所以,如果你将禁用任何CSS转换和过渡您的代码必须工作的权利。 您也可以添加自己的分机:如果map._animatingZoom === true然后把你的行动,以阵列,当map._catchTransitionEnd叫这个过程从阵列和流程改变你的行动:

if (L.DomUtil.TRANSITION) {
    L.Map.addInitHook(function () {
        L.DomEvent.on(this._mapPane, L.DomUtil.TRANSITION_END, function () {
            var zoom = this._zoomActions.shift();
            if (zoom !== undefined) {
                this.setZoom(zoom);
            }
        }, this);
    });
}

L.Map.include(!L.DomUtil.TRANSITION ? {} : {
    _zoomActions: [],
    queueZoom: function (zoom) {
        if (map._animatingZoom) {
            this._zoomActions.push(zoom);
        } else {
            this.setZoom(zoom);
        }
    }
});


文章来源: Why does calling leaflet's setZoom twice results on the second being ignored?