2011-01-04 11 views
0

Ich versuche, Zugriff auf einen lopp-Index in verschachtelten Callbacks zu bekommen. Hier ist der Code:javascript: Zugriff auf einen Schleifenzähler in verschachtelten Callbacks

gatherAddresses: function(){ 
    var divs = $('#searchResults .address'); 
    var addrs = []; 
    for (var i = 0; i < divs.length; i++) { 
     if (divs[i].className == 'address') { 
      var address = $.trim($(divs[i]).html()); 
      var rel = divs[i].getAttribute('rel'); 
      results.addresses.push({ 
       address: address, 
       rel: rel 
      }); 
      results.geocoder.getLatLng(address, function(point){ 

       if (!point) { 
        alert(address + ' not found'); 
       } 
       else { 
        var marker = new GMarker(point); 

        //chmurka :) 
        GEvent.addListener(marker, "click", function(){ 

/////////////here I want the loop index 

         marker.openInfoWindowHtml("<b>""</b><br/>"); 
        }); 
        results.map.addOverlay(marker); 
        addrs.push({ 
         rel: results.findRel(address), 
         point: point 
        }); 
        results.findCenter(addrs, results.map); 


       } 
      }); 
     } 
    } 
}, 

Ich weiß, es geht um Rückrufe zu verstehen und Variablen Tive aber ich bitte um Ihre Hilfe, da es mein erstes Callback-Problem ist :)

Antwort

3

Ihr Rückruf hat bereits Zugriff auf i aufgrund von Schließungen, aber es hat einen "Verweis" auf die Variable, so dass der Wert möglicherweise nicht der gewünschte sein wird, da es immer der neueste und größte sein wird, wenn der Rückruf den Wert verwenden soll, wenn i wenn results.geocoder.getLatLng wurde aufgerufen Sie müssen eine Kopie von i über eine andere, anonymous erstellen s-Funktion:

(function(e) { // get a copy of the value that WON'T change 
    GEvent.addListener(marker, "click", function(){ 
    // use e here as the index 
    }); 
})(i); // pass the value of i in 
+0

Großartig! Ich habe auch die vorherige Funktion eingepackt und ich habe mein ich! Vielen Dank – greg606

1
GEvent.addListener(marker, "click", function (loopIndex) { 
    return function() { 
    // the variable "loopIndex" will have the value of i 
    marker.openInfoWindowHtml("<b>""</b><br/>"); 
    } 
}(i)); 
Verwandte Themen