-1

新しい値を明示的に割り当てたときに JSON 構造が更新されないのはなぜですか?

items[0][i]['human_addressItem'] = address;

人間の住所を取得するために緯度と経度を地理復帰させています。その部分は正常に機能していますが、JSON に挿入できます。なぜですか?

これは実行中の例です:

http://jsfiddle.net/KGbRh/

コード:

HTML:

<script src="http://code.jquery.com/jquery-2.0.2.min.js"></script>
<script src="http://ajax.microsoft.com/ajax/jquery.templates/beta1/jquery.tmpl.min.js"></script>
<script src="https://maps.googleapis.com/maps/api/js?v=3.exp&sensor=false"></script>
<div class="container-fluid">
    <!-- Tables -->
    <section id="tables">
        <table>
            <thead>
                <tr>
                    <th>[name]</th>
                    <th>[txtLat]</th>
                    <th>[txtLon]</th>
                    <th>[human_address]</th>
                </tr>
            </thead>
            <tbody id="items">
                <script id="tmpItems" type="text/html">
                    <tr>
                    <td><input value="${name}" type="text" name="[name]"></td>
                    <td><input value="${Latitude}" type="text" name="[txtLat]"></td>
                    <td><input value="${Longitude}" type="text" name="[txtLon]"></td>
                    <td><input value="${human_addressItem}" type="text" name="[human_address]"></td>
                    </tr>
                </script>
            </tbody>
        </table>
    </section>
</div>

ジャバスクリプト:

 //GEOCORDER
    geocoder = new google.maps.Geocoder();
    items = [
        [{
            "Longitude": -73.929489,
                "Latitude": 40.76079,
                "name": "Electronics"
        }, {
            "Longitude": -73.761727,
                "Latitude": 40.695817,
                "name": "02 Dodge (PICS)"
        }], {
            "active": 0
        }];

    for (var i = 0; i < items[0].length; i++) {
        var address = "";

        var lat = parseFloat(items[0][i]['Latitude']);
        var lng = parseFloat(items[0][i]['Longitude']);
        var latlng = new google.maps.LatLng(lat, lng);
        geocoder.geocode({
            'latLng': latlng
        }, function (results, status) {
            if (status == google.maps.GeocoderStatus.OK) {
                if (results[1]) {
                    var address = results[1].formatted_address;
                    //alert(address);
                    console.log(address);
                } else {
                    alert('No results found in: ' + items[0][i]['name']);
                }
            } else {
                alert('Geocoder failed due to: ' + status + " in: " + items[0][i]['name']);
            }
        });
        items[0][i]['human_addressItem'] = address;
    }
    var o = items;
    $("#tmpItems").tmpl(items[0]).appendTo("#items");
4

2 に答える 2

1

すべてのポスト レスポンス コードをコールバック関数に入れる必要があります。

geocoder.geocode({'latLng': latlng}, 
  function (results, status) {
    if (status == google.maps.GeocoderStatus.OK) {
        if (results[1]) {
            var address = results[1].formatted_address;
            alert (address);
            items[0][i]['human_addressItem'] = address;
            var o = items;
            //items[i]['human_addressItem']) now holds the address
            alert (items[i]['human_addressItem']);
        } else {
            alert('No results found in: ' + items[0][i]['name']);
        }
    } else {
        alert('Geocoder failed due to: ' + status + " in: " + items[0][i]['name']);
    }
  });
  //any code here will run before your function above
}

上記のコメントによると、これは AJAX に関するものであり、したがって Async に関するものです。geocoder.geocode 関数は AJAX 呼び出しを行います。

于 2013-06-07T17:29:13.420 に答える
1

コード内のいくつかのエラー:

1) 変数アドレス = ""; & var address = results[1].formatted_address; アドレス変数のスコープが異なります。

2) 非同期応答。コールバックで ("#items") に追加してみてください

コードを更新しました。JSFiddleにチェックイン

//GEOCORDER
geocoder = new google.maps.Geocoder();
items = [
    [{
        "Longitude": -73.929489,
            "Latitude": 40.76079,
            "name": "Electronics"
    }, {
        "Longitude": -73.761727,
            "Latitude": 40.695817,
            "name": "02 Dodge (PICS)"
    }], {
        "active": 0
    }];

    function updateAddress(i) {
       geocoder.geocode({
          'latLng': latlng
         }, function (results, status) {
            if (status == google.maps.GeocoderStatus.OK) {
                if (results[1]) {
                var address = results[1].formatted_address;
                //alert(address);
                console.log(address);
                items[0][i]['human_addressItem'] = address;

                var o = items;
                 $("#tmpItems").tmpl(items[0][i]).appendTo("#items");

            } else {
                alert('No results found in: ' + items[0][i]['name']);
            }
        } else {
            alert('Geocoder failed due to: ' + status + " in: " + items[0][i]['name']);
        }
    });   

  }

for (var i = 0; i < items[0].length; i++) {
    var address = "";

    var lat = parseFloat(items[0][i]['Latitude']);
    var lng = parseFloat(items[0][i]['Longitude']);
    var latlng = new google.maps.LatLng(lat, lng);

    updateAddress(i);
}
于 2013-06-07T17:29:56.033 に答える