2015-10-05 69 views
1

如何暫時禁用viewchangeend事件,使用setView方法更改視圖並再次重新啓用viewchangeend事件?暫時禁用「viewchangeend」事件

這裏是什麼,我現在做的輕型版本:

var mapEventsObjects = []; 

/* Remove map events */ 
for (var i = 0; i < mapEventsObjects.length; i++) { 
    Microsoft.Maps.Events.removeHandler(mapEventsObjects[i]); 
} 

/* Change the view */ 
map.setView({ 
    "zoom": zoom, 
    "center": new Microsoft.Maps.Location(lat, long) 
}); 

/* Add map events back */ 
var mapViewChangeEnd = Microsoft.Maps.Events.addHandler(map, "viewchangeend", function (e) { 
    console.log("viewChangeEnd Fired: ", e); 
}); 

mapEventsObjects.push(mapViewChangeEnd); 

我想到的是看到沒有viewChangeEnd在控制檯被解僱,但它似乎有不是一次,而是兩次。

任何想法爲什麼它不工作?

回答

0

您可以創建一個簡單的布爾變量gobal。如果您想忽略viewchangeend事件,請將該變量設置爲true。然後,在viewchangeend事件的事件處理程序中,可以執行簡單檢查,如果此變量爲true,則將該變量設置爲false並離開該函數。以下是您的代碼的修改版本:

var mapEventsObjects = [], skipViewChangeEnd = false; 

//Add view change end event to map. 
var mapViewChangeEnd = Microsoft.Maps.Events.addHandler(map, "viewchangeend", function (e) { 
    //Check to see if you want to skip this event once. 
    if(skipViewChangeEnd){ 
     skipViewChangeEnd = false; 
     console.log("viewChangeEnd skipped"); 
    }else{ 
     //Your logic for handling this event 
     console.log("viewChangeEnd Fired: ", e); 
    } 
}); 

mapEventsObjects.push(mapViewChangeEnd); 

skipViewChangeEnd = true; 

/* Change the view */ 
map.setView({ 
    "zoom": zoom, 
    "center": new Microsoft.Maps.Location(lat, long) 
}); 
+0

我需要在調用'setView'之前臨時禁用事件,然後重新啓用它。由於JS的異步特性,如果我將該變量設置爲true,則調用'setView'並將其重新設置爲false,在調用'setView'時它將爲false。 – Mahdi

+0

不,它不會。在setView調用已經觸發並且地圖移動完成之前它不會被設置爲false。之前我已經多次使用過這種方法。 – rbrundritt

+0

你永遠不會重新啓用該事件。在調用'setView'後,你必須將'skipViewChangeEnd'設置爲'true',所以它將繼續正常工作。但是,如果你這樣做,它會在'setView'完成之前設置爲'true',因此讓事件再次觸發。 – Mahdi