如何在功能组中使用.openPopup方法?

时间:2016-04-13 15:00:12

标签: leaflet mapbox

我有一组带有绑定弹出窗口的标记,但是当在图层控件中切换标记组时,我无法弄清楚如何显示所有弹出窗口。

  

例如,我有我的标记:

var testMarker = L.marker([32.9076,33.35449]).bindPopup('Marker 1');
var testMarkerTwo = L.marker([33.58259,34.64539]).bindPopup('Marker 2');
  

然后,我把它放在一个freature组中并附加openPopup方法:

var markerGroup = L.featureGroup([testMarker,testMarkerTwo]).openPopup().addTo(map);

这不起作用。

我的最终目标是将该featureGroup添加到我的图层控件中,我可以在其中切换/打开该组。在我开始讨论之前,我首先需要了解openPopup方法无法正常工作的原因。

编辑:以下答案似乎只适用于简单的Leaflet API,而不适用于Mapbox API。

1 个答案:

答案 0 :(得分:1)

这里有几个问题。第一个是默认情况下,Leaflet每次打开另一个时关闭先前打开的弹出窗口。第二个是,虽然你的标记有弹出窗口绑定到它们,markerGroup没有,即使它,markerGroup.openPopup只会导致一个弹出窗口打开。

要解决第一个问题,您可以使用this answer中的黑客攻击。如果将以下代码放在脚本的开头(在定义map之前),它将覆盖默认行为并允许您一次打开多个弹出窗口:

L.Map = L.Map.extend({
    openPopup: function(popup) {
        this._popup = popup;
        return this.addLayer(popup).fire('popupopen', {
            popup: this._popup
        });
    }
});

然后,一旦您能够打开多个弹出窗口,就可以使用markerGroup方法打开eachLayer中的所有弹出窗口:

var markerGroup = L.featureGroup([testMarker,testMarkerTwo]).addTo(map);
markerGroup.eachLayer(function(layer) {
  layer.openPopup();
});

这是一个小例子:

http://fiddle.jshell.net/nathansnider/02gsb1Lt/