我尝试加载geoJson,然后对这些poi应用过滤器。每个标记都有一个自定义弹出窗口。 在每个标记上绑定自定义弹出窗口工作正常,直到我在featureLayer上调用setFilter()。 基本上我的代码看起来像这样
var map;
var featureLayer;
function initMap(mapInfos){
var southWest = L.latLng(mapInfos.sw.lat, mapInfos.sw.lng),
northEast = L.latLng(mapInfos.ne.lat, mapInfos.ne.lng),
bounds = L.latLngBounds(southWest, northEast);
map = L.mapbox
.map('map', 'oxyde.xxxxxx', {'maxBounds' : bounds})
.setView([mapInfos.center.lat, mapInfos.center.lng], mapInfos.defaultZoom);
featureLayer = L.mapbox.featureLayer().loadURL('/pois').addTo(map);
featureLayer.on('ready', setContentToAllPois);
return mapInfos;
}
function setContentToAllPois(){
var promises = new Array();
featureLayer.eachLayer(function(layer) {
promises.push(setContentToPoi(layer));
});
$.when.apply($.when.apply, promises)
.done(doneLoadingPois)
.fail(logError);
}
function setContentToPoi(layer){
var dfd = new jQuery.Deferred(),
poi = layer.feature.properties.poi;
$.get('/poi/' + poi._id + '/content')
.done(function(content){
layer.bindPopup(content);
dfd.resolve(layer);
})
.fail(function(e){
dfd.reject(e);
});
return dfd.promise();
function doneLoadingPois(){
featureLayer.setFilter(function(feature) {
return true;
})
}
如果我在doneLoadingPois中注释setFilter(...)行,弹出窗口显示正常。 1-我在这里缺少什么? 2-为什么我必须使用featureLayer var? (使用map.featureLayer不起作用,似乎它不是同一个对象)
谢谢你!答案 0 :(得分:2)
.setFilter()
重置图层的内容,因此这是预期的行为 - 调用它会替换图层的内容,包括任何自定义弹出窗口。如果要在将图层添加到地图时绑定弹出窗口,可以使用.on('layeradd'
事件。