使用地理编码地址更新jQuery Datatables单元格

时间:2012-07-10 16:39:18

标签: jquery datatables

我有一个jquery数据表,它显示我的数据(见下文)。您会注意到最后一列是地址,而行数据只是表示加载。

Table

我想使用数据中的经度和纬度从谷歌地图api获取地址。

我知道获取地址可能需要一些时间,如果返回3000个结果,则需要很长时间,这就是为什么我没有在数据中传递预先编码的地址。

显示表数据后,我可以开始为每行的lat / lng进行地理编码,并在每个行完成时更新地址列吗?

我也使用谷歌地图的GMAP3 jQuery插件,所以我可以得到这样的地址:

        // get address
        $("#map").gmap3({
          action: 'getAddress',
          latLng: [lati, longi],
          callback: function (results) {
            content = results && results[1] ? results && results[1].formatted_address : 'No Address';
          } // end callback

        });

更新

差不多完成了:) 这些类被添加到lat,long和address ok,我正在接收控制台中的地理编码地址。我需要做的就是将地址放入表格中的正确行。我该怎么做?

我的代码       var historyArray = window.opener.historyArray;

 $(document).ready(function() {
            //$('#dynamic').html( '<table cellpadding="0" cellspacing="0" border="0" class="display" id="report"></table>' );
            $('#report').dataTable( {
                "aaData": historyArray,
                "aoColumns": [
                    { "mDataProp": "User" },
                    { "mDataProp": "Timestamp" },
                    { "mDataProp": "Latitude" },
                    { "mDataProp": "Longitude" },
                    { "mDataProp": "Address" }
                ],
                "iDisplayLength": 25,
                "bJQueryUI": true,
                "sPaginationType": "full_numbers",
                "sDom": '<"H"Tfr>t<"F"ip>',
                "oTableTools": {
                            "sSwfPath": "swf/copy_csv_xls_pdf.swf",
                            "aButtons": ["copy", "csv", "xls", "pdf"]
                                      },
                "fnInitComplete": function () {
                    getAdresses();
                }
            } );    

$("#report td:nth-child(3)").addClass("lat");
$("#report td:nth-child(4)").addClass("lng");
$("#report td:nth-child(5)").addClass("addi");
} );

 function getAdresses() {
   $.each(historyArray, function (index,data) {
    // get address
    var map = window.opener.document.getElementById('dispatcher');
    $(map).gmap3({
      action: 'getAddress',
      latLng: [data.Latitude, data.Longitude],
      callback: function (results) {
        content = results && results[1] ? results && results[1].formatted_address : 'No Address';
        console.log(content);
      } // end callback

    });
   });
 }

更新2

嗨,更新了代码。 因为我添加了$(this).html(内容);在gmap3的回调中它没有更新'addi'单元格,我该如何解决?

 function getAdresses() {
   $(".addi").each(function () {
     var lat = $(this).siblings(".lat").html().toString();
     var lng = $(this).siblings(".lng").html().toString();
      // get address
      $(map).gmap3({
        action: 'getAddress',
        latLng: [lat, lng],
        callback: function (results) {
          content = results && results[1] ? results && results[1].formatted_address : 'No Address';
          $(this).html(content);
        } // end callback

      });
   });
 }

最终更新 给予解决方案添加到解决方案中。 我发现当我将数据导出到CSV,Excel等时,地址数据没有更新。

我将代码修改为此。

       myTable = $('#report').dataTable({
     "aaData": historyArray,
     "aoColumns": [{
       "mDataProp": "User"
     }, {
       "mDataProp": "Timestamp"
     }, {
       "mDataProp": "Latitude"
     }, {
       "mDataProp": "Longitude"
     }, {
       "mDataProp": "Address"
     }],
     "bPaginate": false,
     "bJQueryUI": true,
     "sPaginationType": "full_numbers",
     "sDom": '<"H"Tfr>t<"F"ip>',
     "oTableTools": {
       "sSwfPath": "swf/copy_csv_xls_pdf.swf",
       "aButtons": ["copy", "csv", "xls", "pdf"]
     },
     "fnInitComplete": function () {
       addClasses();
     }
   });
   window.setTimeout(function () {
     getAdresses();
   }, 1000);
 });

 function addClasses() {
   $("#report td:nth-child(3)").addClass("lat");
   $("#report td:nth-child(4)").addClass("lng");
   $("#report td:nth-child(5)").addClass("addi");
 }

 function getAdresses() {
   $(".addi").each(function () {
     var lat = $(this).siblings(".lat").html().toString();
     var lng = $(this).siblings(".lng").html().toString();
     var addi = $(this);
     $(addi).html("Reverse geocoding..");
     var aPos = myTable.fnGetPosition(this);

     // get address
     $('#hidden').gmap3({
       action: 'getAddress',
       latLng: [lat, lng],
       callback: function (results) {
         content = results && results[1] ? results && results[1].formatted_address : 'No Address';
         myTable.fnUpdate(content, aPos[0], 4);
       } // end callback

     });
   });
 }

现在数据真正更新了。

1 个答案:

答案 0 :(得分:1)

如果我理解正确:

您可以通过jQuery将类添加到最终列,如下所示:

$("#table td:nth-child(5)").addClass("someClass");

然后你可以创建一个在初始化表之后运行的函数:

//Part of the datatable initialization
"fnInitComplete": function () {
    myAwesomeFunction();
}

在该函数中,您可以根据类进行.each()并抓住兄弟姐妹(lat和long)将这些传递给api并使用结果.html()来替换加载文本。 我希望这是有道理的。如果不让我知道:)

// // EDIT

抓住兄弟姐妹: 首先给他们一个班级

$("#table td:nth-child(3)").addClass("lat");

$("#table td:nth-child(4)").addClass("long");

请记住,必须在初始化数据表后应用所有这些样式。

然后你可以:

var lat = $(this).siblings(".lat").html().toString();
var long = $(this).siblings(".long").html().toString();

///////////// ///编辑2 /// /////////////

首先移动此代码:

$("#report td:nth-child(3)").addClass("lat");
$("#report td:nth-child(4)").addClass("lng");
$("#report td:nth-child(5)").addClass("addi");

对于这样的函数:

$("#report").on("draw", function() {
   addClasses();
});

function addClasses() {
    $("#report td:nth-child(3)").addClass("lat");
    $("#report td:nth-child(4)").addClass("lng");
    $("#report td:nth-child(5)").addClass("addi");
}

addClasses()之前将fnInitcomplete函数添加到getAddresses()

这样,如果您更改页面或排序或者对表格进行其他更改,则将应用/重新应用这些类。

我不确定地理位置的API是如何工作的,但为了抓住长格子我会做这样的事情:

    $(".addi").each(function () {
        var lat = $(this).siblings(".lat").html().toString();
        var lng = $(this).siblings(".lng").html().toString();
        // Now pass these parameters to the geocode function and store the result in some var
        //In this case lets call it result
        //Now just replace the loading with the result:
        $(this).html(result);
    });

将上述代码放在getAddresses()函数中,它应该会给你结果。

请告诉我这是否足够,如果工作正常;)