2016-08-02 108 views
-1

我正在使用jQuery的javaScript。我有一些數據,但顯示兩次。使用javaScript顯示特定記錄

<input type="hidden" id="btnlistTime" /> 
for(var i = 0; i < msg.driverList.length; i++){ 
     $.ajax({ 
      type: "post", 
      url: "data/get_lastReportedTime.php", 
      data: {Driver: msg.driverList[i].fullname} 
     }).done(function (data){ 
      $('#btnlistTime').val(data); 
      for(var i = 0; i < msg.driverList.length; i++){ 
       OnlineDriver.push([msg.driverList[i].id, 
           msg.driverList[i].fullname, 
           $('#btnlistTime').val(), 
           msg.driverList[i].lat, 
           msg.driverList[i].lng, 
           msg.driverList[i].logintime]); 
      } 
     }); 
} 
UpdateOnlineDriver(OnlineDriver); 

function UpdateOnlineDriver(data) { 

    tableOnlineDriver = $('#tblDriverDetails').dataTable({ 
     "data": data, 
     "bFilter": true, 
     "stateSave": true, 
     "columnDefs": [    
       {"sClass": "hide_me", "aTargets": [3]}, 
       {"sClass": "hide_me", "aTargets": [4]}, 
       {"sClass": "hide_me", "aTargets": [5]} 
     ] 
    }); 
} 

,並使用AJAX我從數據庫中獲取最後一次,並添加到msg.driverList,它是來自插座,像這樣。

('1059', 'Ashish', '9.962479', '-84.082434', '1324567890'); 
('1060', 'Ashish1', '9.962479', '-84.082434', '1324567890'); 
('1061', 'Bhargav', '9.962479', '-84.082434', '0987654321'); 

但問題是,當我referece它表明這樣的頁面,

('1059', 'Ashish', '9.962479', '-84.082434', '1324567890'); 
('1059', 'Ashish', '9.962479', '-84.082434', '1324567890'); 
('1060', 'Ashish1', '9.962479', '-84.082434', '1324567890'); 
('1060', 'Ashish1', '9.962479', '-84.082434', '1324567890'); 
('1061', 'Bhargav', '9.962479', '-84.082434', '0987654321'); 
('1061', 'Bhargav', '9.962479', '-84.082434', '0987654321'); 

所以請幫助我我該怎麼解決這個問題,我想告訴喜歡,

('1059', 'Ashish', '9.962479', '-84.082434', '1324567890'); 
('1060', 'Ashish1', '9.962479', '-84.082434', '1324567890'); 
('1061', 'Bhargav', '9.962479', '-84.082434', '0987654321'); 

請幫助我,thax提前。

+0

想要在'btnlistTime'中顯示什麼:你在每次迭代中覆蓋它,所以只有你設置的最後一個值會保留... – trincot

回答

0

請嘗試更改變量名的for循環如下:

for(var i = 0; i < msg.driverList.length; i++){ 
    $.ajax({ 
     type: "post", 
     url: "data/get_lastReportedTime.php", 
     data: {Driver: msg.driverList[i].fullname} 
    }).done(function (data){ 
     $('#btnlistTime').val(data); 
     // change var "i" to "j" 
     for(var j = 0; j < msg.driverList.length; j++){ 
      OnlineDriver.push([msg.driverList[j].id, 
          msg.driverList[j].fullname, 
          $('#btnlistTime').val(), 
          msg.driverList[j].lat, 
          msg.driverList[j].lng, 
          msg.driverList[j].logintime]); 
     } 
    }); 
} 
0

你在你的代碼的幾個問題:

  • 您提供done職能中的異步執行代碼將在之後執行您的電話UpdateOnlineDriver(OnlineDriver)。因此,首先將執行整個外部for循環,然後UpdateOnlineDriver,然後纔會開始調用done的回調函數。爲了解決這個問題,你需要在done回調中調用它,並且只有當你檢索到最後一個數據時。

  • 這是沒有意義的有回調函數內的for循環,因爲它會單獨爲每個驅動程序已經(參見外環)被稱爲:算了算的push電話你會做的數量:每個迭代外部循環,您將重新迭代所有驅動程序並執行push。所以這是一個二次推動量。不能成爲你想要的。

  • 一旦內for環路解除,您將有怎樣的變化第一次運行到結束的問題,然後纔回調函數被調用許多次,每個的價值i等於陣列的長度。但是,您需要在回調的每次調用中獲得不同的i值。要做到這一點,有很多解決方案,其中之一是使用let而不是var

這裏是for循環部分的修正建議:

// Use "let" instead of "var" to have a locally scoped variable 
// which is available within the $.ajax callback 
for(let i = 0; i < msg.driverList.length; i++){ 
    $.ajax({ 
     type: "post", 
     url: "data/get_lastReportedTime.php", 
     data: {Driver: msg.driverList[i].fullname} 
    }).done(function (data){ 
     // Do not iterate here. 
     $('#btnlistTime').val(data); 
     OnlineDriver.push([ 
      msg.driverList[i].id, 
      msg.driverList[i].fullname, 
      $('#btnlistTime').val(), 
      msg.driverList[i].lat, 
      msg.driverList[i].lng, 
      msg.driverList[i].logintime 
     ]); 
     // If this is the last entry, then call out 
     if (i === msg.driverList.length-1) { 
      UpdateOnlineDriver(OnlineDriver) 
     } 
    }); 
} 

注意,你會一次又一次地改寫的btnlistTime的價值,所以它最終只顯示最後獲取的數據驅動程序。