leaflet.js setView()& map.on(" zoomend")循环调用

时间:2015-04-02 14:30:05

标签: angularjs leaflet

我使用angularjs和leaflet.js。

在我的控制器中,我在传单地图上设置了一个监听器zoom:

map.on("zoomend", function () {
    refreshData(...); // use the zoom & bound to get data.
});

refreshData()根据许多条件(构面)刷新地图中显示的标记,然后使用 setView()重新调整地图。 ( refreshData()也可以被其他函数调用)

var refreshData = function(){
    // lot of thinks...
    map.setView(new L.LatLng(lat,lon),zoomlevel);
}

因此,当调用 refreshData 时,我想禁用 map.on(“zoomend”)侦听器,因为它会进行循环调用。

怎么做?

2 个答案:

答案 0 :(得分:2)

我会使用标志变量。

map.on("zoomend", refreshData);

var refreshData = function(){
    map.off("zoomend");
    // lot of thinks...
    map.setView(new L.LatLng(lat,lon),zoomlevel);
    map.on("zoomend", refreshData);
}

答案 1 :(得分:0)

感谢@pk。为了答案。 我必须添加一个超时以使其正常工作,因为 map.on(“zoomend”,refreshData); 在调用 map.setView(new L.LatLng( lat,lon),zoomlevel); 需要一些时间才能完成:

var refreshData = function(){
    map.off("zoomend");
    // lot of thinks...
    map.setView(new L.LatLng(lat,lon),zoomlevel);
    $timeout(function () {
        map.on("zoomend", refreshData);
    },3000);
}

最好的方法是使用 setView 进行回调,但我找不到办法做这样的事情:

var refreshData = function(){
    map.off("zoomend");
    // lot of thinks...
    map.setView(
        new L.LatLng(latlon["lat"], latlon["lon"]),
        GeographieService.getZoomFromLocalisationtype("continents"), 
        {'reset' : true }
    ).then(function (data) {
        map.on("zoomend", refreshData);
    });
}

任何想法?