4

位置オブジェクトの配列リストがあり、そのうちのいくつかを使用して完全な住所を作成し、それをジオコーディングしています。OK ステータスを受け取ったら、マップ上にマーカーを配置します。これはすべてうまくいきます。ただし、ここでは、配列リスト LocationName の別のプロパティを使用して、各マーカーに情報ウィンドウを配置したいと考えています。コードはここにあります:

function placeMarkers(myObjList){
var geocoder = new google.maps.Geocoder();
for(var i=0; i<myObjList.length; i++){
    var fullAddress = myObjList[i].Address + ", " + myObjList[i].City + ", " + myObjList[i].State + ", " + myObjList[i].Zip;
    /* The variable I would like to have access to in the geocode call */
    var locationName = myObjList[i].LocationName;

    geocoder.geocode( { 'address': fullAddress}, function(results, status) {
        if (status == google.maps.GeocoderStatus.OK) {
            alert(locationName);
            var marker = new google.maps.Marker({
                map: map,
                position: results[0].geometry.location,
                clickable: true
            });
            markers.push(marker);
        } else {
            alert("Geocode was not successful for the following reason: " + status);
        }
    });
}
}

アラートは、ステータスが OK になったときに locationName が何であるかを確認することです。しかし、テストでは常に同じ値です。毎回正しい値を反映するようにこれを調整できたら、情報ウィンドウをマーカーに配置するコードを並べます。

どんな助けでも大歓迎です!

4

1 に答える 1

4

最も簡単な方法は、ループ内にローカル スコープ ブロックを作成して、ジオコーディングを行うデリゲート/匿名関数を追加するたびに locationName が実際に異なる変数を参照するようにすることです。var をループに配置しても、変数の新しいインスタンスは作成されません。var 宣言は、本質的に、囲んでいるスコープ ブロックの先頭に移動されます。

for(var i=0; i<myObjList.length; i++){
    var fullAddress = myObjList[i].Address + ", " + myObjList[i].City + ", " + myObjList[i].State + ", " + myObjList[i].Zip;
    //begin scope block
    (function(){
        var locationName = myObjList[i].LocationName;
        var yourObject = myObjList[i];
         //etc.
        geocoder.geocode( ...);
    //end scope block
    })();
}

編集:

または、無名関数を渡して配列内の各項目のコードを実行できるフレームワーク/ を使用している場合、その種のスコープの問題は自動的に処理されます。

于 2012-05-11T17:12:57.050 に答える