2010-09-14 11 views
0

J'utilise http://tile.cloudmade.com/wml/latest/web-maps-lite.js pour géocoder.puzzle: la valeur dans clousure est modifiée

Il y a un réseau d'adresses contenant environ 20 addresess

addresses[n] = {where:where,who:who,contact:contact,note:note,type:type}; 

Je boucle le tableau géocodage

for (var i = 0; i < addresses.length; i++) { 
    geocoder2.getLocations(addresses[i].where, function(response) { //a callback 
     return function(k){ 
     Lat[k] = response.features[0].centroid.coordinates[0]; 
     Lng[k] = response.features[0].centroid.coordinates[1]; 
     latlng = new google.maps.LatLng(Lat[k], Lng[k]); 
     MarkerArray[k] = new google.maps.Marker({ 
      map: map, 
      position: latlng, 
      zIndex: k, 
      title: addresses[k].who, 
      icon: icons(addresses[k].type.trim()) 
     });}(i) // a closure function called 
    }); 
} 

Mais il fonctionne toujours sur l'indice final. Pourquoi??

Répondre

1

Vous avez le problème de boucle de fermeture. Vous semblez essayer de le réparer en ajoutant la fermeture return function(k)..., mais tout cela se produit à l'intérieur de la fonction de rappel, donc il ne s'exécutera pas tant que la boucle ne sera pas terminée et que i pointera sur sa valeur finale.

Vous devrez pousser cette enveloppe à un niveau il est donc directement dans la boucle:

for (var i = 0; i < addresses.length; i++) { 
    geocoder2.getLocations(addresses[i].where, function(k) { //a callback 
     return function(response){ 
      Lat[k] = response.features[0].centroid.coordinates[0]; 
      Lng[k] = response.features[0].centroid.coordinates[1]; 
      latlng = new google.maps.LatLng(Lat[k], Lng[k]); 
      MarkerArray[k] = new google.maps.Marker({ 
       map: map, 
       position: latlng, 
       zIndex: k, 
       title: addresses[k].who, 
       icon: icons(addresses[k].type.trim()) 
      }); 
     } 
    }(i)); // binding *here* instead! 
} 

Ou utilisez Function#bind pour éviter la fonction imbriquée.

+0

Votre solution wrapper out fonctionne dans Firefox, mais dans IE et Chrome .... ont toujours le même problème. Je vais prendre un peu de temps pour regarder dans la solution de liaison – ValidfroM

+0

Très étrange, tous les lat et lng sont corrects, mais juste le titre et l'icône sont faux ... – ValidfroM