要重现这个问题,你可以去http://leafletjs.com/和JavaScript控制台,写上如下:
> map.getZoom()
15
> map.setZoom(10);map.setZoom(1);
Object
> map.getZoom()
10
我期待最终的getZoom返回1
。 为什么会出现这种情况? 该问题可能与缩放动画有关。 如果setZoom在动画结束之前调用,它就会被忽略。
我整合传单与emberjs并希望允许外部条件改变变焦变化。 如果用户更改快速放大,效果并不期望的。
L.Map.setZoom
称为L.Map.setView
那个叫L.Map._animateZoomIfClose
。 如果map._animatingZoom
为真,那么任何变焦停止。 map._animatingZoom
工作就像找缩放动画:
- 检查在
L.Map._animateZoomIfClose
如果true
停止变焦别人通话L.Map._animateZoom
。 - 设置为
true
在L.Map._animateZoom
并开始CSS过渡。 - 设置为
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?