2015-04-02 2 views
1

Я использую angularjs и leaflet.js.leaflet.js setView() & map.on ("zoomend") циклический вызов

В моем контроллере я установить слушателя на листовке карте масштаба:

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

RefreshData() обновить маркеры, отображаемые на карте по многим критериям (фасеты) и повторно настроить карту с комплектView(). (RefreshData() также может быть вызвана другой функцией)

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

Так что, когда RefreshData называется я хочу, чтобы отключить map.on («zoomend») слушателем, потому что он делает циклический вызов ,

Как это сделать?

ответ

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); 
} 
+0

благодарит за вашу помощь. это не может работать для меня, потому что мне нужно вызвать refreshdata при масштабировании. – AlainIb

+0

Я пытался сделать это, но не работал: * var refreshData = function() {map.on ("zoomend", function() {}); map.setView (новый L.LatLng (lat, lon), zoomlevel); ...} * – AlainIb

+0

Я неправильно понял ваш вопрос. Я отредактировал мой пост –

0

Благодаря @pk. для ответа. Мне пришлось добавить таймаут, чтобы он работал правильно, потому что map.on («zoomend», refreshData); вызывается сразу после вызова map.setView (новый 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); 
    }); 
} 

любая идея ?