Schaamteloze dubbelpost, even venten.
Bah, wat is Google lekker destructief geweest met de overgang van v2 naar v3 van de Google Maps API... Een paar pareltjes:
JavaScript:
1
2
3
4
| while (this.markers[0])
this.markers.pop().setMap(null);
while (this.polygons[0])
this.polygons.pop().setMap(null); |
...is zo veel makkelijker dan het volgende, natuurlijk:
JavaScript:
1
2
3
| this.markers = [];
this.polygons = [];
this.map.clearOverlays(); |
Met andere woorden, clearOverlays() hebben ze maar verwijderd.
Of deze: een polygoon had voorheen een
getPath()-method die een array met alle vertices teruggaf (een array van LatLng's dus). Mijn oude code ging toen stuk op dit:
JavaScript:
1
2
3
| if (path.length > 0 &&
(path[0].lat() != path[path.length - 1].lat() ||
path[0].lng() != path[path.length - 1].lng())) |
Een of andere TypeError diep in Google's eigen code. Kon ik dus niet zo veel mee. Wat blijkt:
getPath() geeft niet meer een array terug, maar een of andere linked list. Die heeft dus wél een length-property die me hier dus aardig om de tuin leidde... Moet nu dus dit zijn:
JavaScript:
1
2
3
| if (path.length > 0 &&
(path.getAt(0).lat() != path.getAt(path.length - 1).lat() ||
path.getAt(0).lng() != path.getAt(path.length - 1).lng())) |
En als pièce de résistance: ik moet polygonen en markers op een map kunnen zetten als user. Voorheen was dat gewoon een click-listener aan de map hangen, maar dat is nu uiteraard niet genoeg meer. Nouja, nu werkt dat ook gewoon, tot je een keer een marker of polygoonvertex binnen een bestaande polygoon wil plaatsen, want die eet by default je click event op zonder verdere propagation naar de map, wat "vroeger" dus wel gewoon gebeurde.
Nu heb ik dus twee nieuwe functieparen nodig:
JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| addMarkerListeners: function(iconType, selectHand)
{
this.polygons.each(function(p){
google.maps.event.addListener(p, "click", function(event) {
this.createMarker(event, event.latLng, iconType, selectHand);
}.bind(this));
}, this);
},
removeMarkerListeners: function()
{
this.polygons.each(function(p){
google.maps.event.clearListeners(p, "click");
});
}, |
Even vrolijk dezelfde event listener aan elke polygon hangen en weghalen als je klaar bent met editen...
Nouja, intussen is mijn oude editor weer geheel feature complete in v3, met nog een maand de tijd voordat v2 plat gaat. Maar ik heb wel eens makkelijkere upgrades gehad.