1

私はおそらくここで愚かなことをしていますが、両方のマーカーが同じタイトルになる理由がわかりません。どちらのマーカーも最終的にジオコーダーからの正しい位置になり、別々の場所に表示されます。

レンダリング前

function gMapInitialize() {

  var myLocs = [<ui:repeat value = "#{LocationBean.locations.address}" var = "loc"       varStatus = "loop">
                   [ "#{loc.name}","#{loc.street}","#{loc.city}","#{loc.state}", "#{loc.zipCode}"]#{!loop.last ? ',' : ''}
                   </ui:repeat>];
   //<![CDATA[                
     var myOptions = {
      center: new google.maps.LatLng(37.212832,-76.750488),
      zoom: 8,
      mapTypeId: google.maps.MapTypeId.HYBRID
    };

    var map = new google.maps.Map(document.getElementById("map_canvas"),
        myOptions);

    var geocoder = new google.maps.Geocoder();

    for(var i = 0; i < myLocs.length; i++){
    var myLoc = myLocs[i];
    var geoOptions = {
    address: myLoc[1] + "," + myLoc[2] + "," + myLoc[3] + "," + myLoc[4],

    }
    geocoder.geocode( geoOptions ,function(results, status){

    if(status == google.maps.GeocoderStatus.OK){
    var marker = new google.maps.Marker({
    map: map,
    position: results[0].geometry.location,
    title: myLoc[0],
    zIndex: i
    });


    }
    });               


  }
  }
 // ]]>

レンダリング後:

function gMapInitialize() {

  var myLocs = [
                   [ "Richmond","9 North 3rd Street","Richmond","VA", "23219"],

                   [ "Hampton Roads","632 North Witchduck Road","Virginia Beach","VA", "23462"]
                   ];
   //<![CDATA[                
     var myOptions = {
      center: new google.maps.LatLng(37.212832,-76.750488),
      zoom: 8,
      mapTypeId: google.maps.MapTypeId.HYBRID
    };

    var map = new google.maps.Map(document.getElementById("map_canvas"),
        myOptions);

    var geocoder = new google.maps.Geocoder();

    for(var i = 0; i < myLocs.length; i++){
    var myLoc = myLocs[i];
    var geoOptions = {
    address: myLoc[1] + "," + myLoc[2] + "," + myLoc[3] + "," + myLoc[4],

    }
    geocoder.geocode( geoOptions ,function(results, status){

    if(status == google.maps.GeocoderStatus.OK){
    var marker = new google.maps.Marker({
    map: map,
    position: results[0].geometry.location,
    title: myLoc[0],
    zIndex: i
    });


    }
    });               


  }
  }
 // ]]>

1 つのループでやりすぎていませんか? クロージャーについて何か聞いていますが、javascript は初めてで、それについて何も知りません。

そうそう: 各マーカーの 2 つの名前のうち 2 番目の名前を取得します。マーカーは正しい位置にありますが、どちらも「Hampton Roads」というタイトルです。したがって、正しい情報がタイトルに渡されますが、最初のタイトルが2番目のタイトルで上書きされているようです。

更新さて、私はそれを修正しました。閉鎖についてもう少し理解していると思います。そのため、主にループがループし続け、関数が呼び出されるまでに、すでに最後になっています。したがって、以下でも、各マーカーはおそらく同じ zIndex を持ち、「i」も渡す必要があります。

for(var i = 0; i < myLocs.length; i++){

    var myLoc = myLocs[i];
    var geoOptions = {
    address: myLoc[1] + "," + myLoc[2] + "," + myLoc[3] + "," + myLoc[4],

    }

    geocoder.geocode( geoOptions ,addMarkers(myLoc[0]));
    }

    function addMarkers(myTitle){
     return function(results,status){
    if(status == google.maps.GeocoderStatus.OK){
    var marker = new google.maps.Marker({
    map: map,
    position: results[0].geometry.location,
    title: myTitle,
    zIndex: i
    });


    }
    };



  }
4

1 に答える 1

0

It's a simple closure issue. myLoc[i] refers to the same entity after the loop ends in both cases. Just wrap it in a function to create a new scope:

   for(var i = 0; i < myLocs.length; i++){
    (function(num) {
    var myLoc = myLocs[num];
    var geoOptions = {
    address: myLoc[1] + "," + myLoc[2] + "," + myLoc[3] + "," + myLoc[4],

    }
    geocoder.geocode( geoOptions ,function(results, status){

    if(status == google.maps.GeocoderStatus.OK){
    var marker = new google.maps.Marker({
    map: map,
    position: results[0].geometry.location,
    title: myLoc[0],
    zIndex: num
    });
    }(i));
    }
于 2012-04-30T12:51:21.563 に答える