Bootstrap_Datatable Ajax請求兩次問題的解決


最近一個項目中使用JQuery Datatable,用起來比較方便,但在測試過程中,發現當條件改變時,有時查詢結果中的數據不正確。

使用FireBug跟蹤時,發現在使用Ajax請求時,點擊一次搜索按鈕,卻發送了兩次請求,一次是原條件的請求,一次是新的請求。

下面是查詢按鈕的代碼。先判斷是否是Datatable,如果是的話,先Destroy掉,再重新創建。

 

[javascript]  view plain copy 在CODE上查看代碼片 派生到我的代碼片
 
  1. function search(data) {  
  2.     var $searchResult = $("#search-result .result-panel");  
  3.       
  4.      if (resultDataTable) {  
  5.         resultDataTable.fnClearTable();  
  6.         $searchResult.dataTable().fnDestroy();  
  7.         $("#resultList").empty();  
  8.     }  else {  
  9.         $searchResult.show();  
  10.     }  
  11.     resultDataTable = $searchResult.dataTable({  
  12.         "bPaginate" : true,  
  13.         "bAutoWidth" : false,  
  14.         "bProcessing": true,  
  15.         "bFilter": false,  
  16.         "bJQueryUI": true,       
  17.         "sPaginationType": "full_numbers",  
  18.         "oLanguage": {                          //漢化  
  19.             "sLengthMenu": "每頁顯示 _MENU_ 條記錄",  
  20.             "sZeroRecords": "沒有檢索到數據",  
  21.             "sInfo": "當前數據為從第 _START_ 到第 _END_ 條數據;總共有 _TOTAL_ 條記錄",  
  22.             "sInfoEmtpy": "沒有數據",  
  23.             "sProcessing": "正在加載數據...",  
  24.             "oPaginate": {  
  25.                 "sFirst": "首頁",  
  26.                 "sPrevious": "前頁",  
  27.                 "sNext": "后頁",  
  28.                 "sLast": "尾頁"  
  29.             }  
  30.         },   
  31.         "bServerSide": true,  
  32.         "sServerMethod": "POST",  
  33.         "sAjaxSource": "${baseUrl}/zpzxResumeSearch.do?&method=<bean:message key='zjzxResume.button.search' />",  
  34.         //"fnServerData": executeQuery,  
  35.         "fnServerParams": function (aoData) {  
  36.             aoData.push({"name": "conds", "value": data});  
  37.         },  
  38.         "aoColumns": [  
  39.             { "mData": null },  
  40.             { "mData": "name" },  
  41.             { "mData": "sex" },  
  42.             { "mData": "birthday" },  
  43.             { "mData": "mobilePhone" },  
  44.             { "mData": "diploma" },  
  45.             { "mData": "workYears" },  
  46.             { "mData": "currentAddress" },  
  47.             { "mData": "hukouAddress" },  
  48.             { "mData": "updateTime" },  
  49.             { "mData": null }  
  50.         ],  
  51.         "aoColumnDefs": [  
  52.              {  
  53.                 "aTargets": [ 1 ],  
  54.                 "mRender": function ( data, type, full ) {  
  55.                         return "<a target='_blank' onmouseover='showLabels(this, event);' onmouseout='hiddenLabels(this, event);' labels='"+buildResumeLabels(full)+"'  href='${baseUrl}/zpzxResumeLookResult.do?resumeId="  
  56.                                 +full.resumeId+"&zpzxTalentId="  
  57.                                 +full.zpzxTalentId+"&method=<bean:message key='zjzxResume.button.showDetailInfo' />'>"  
  58.                                 + data + "</a>";            
  59.                 }  
  60.           },  
  61.           {  
  62.               "aTargets": [ 0 ],  
  63.               "mRender": function ( data, type, full ) {  
  64.                     return "<input type='checkbox' value='"+full.resumeId+"' class='chkExportResume' />";  
  65.               }  
  66.           },  
  67.           {            
  68.               "aTargets": [ 10 ],  
  69.               "mRender": function ( data, type, full ) {  
  70.                     return buildLink(data, type, full);  
  71.               }  
  72.           }  
  73.         ]  
  74.     });  

跟蹤Datatable后發現,在執行

[javascript]  view plain copy 在CODE上查看代碼片 派生到我的代碼片
 
  1. resultDataTable.fnClearTable();  

方法時,實際調用了一次fnDraw方法,該方法會調用Ajax請求,然后在DataTable的_fnInitialise方法中會再調用一次Ajax請求。

 

查看Datatable發現fnClearTable方法實際上還有一個布爾值參數來控制是否執行fnDraw方法,即只要把該語句修改為

 

[javascript]  view plain copy 在CODE上查看代碼片 派生到我的代碼片
 
  1. resultDataTable.fnClearTable(false);  

一切就OK了。

 

調查該問題Google了很久,最后還是通過看源碼解決。不過,由此也看到Datatable作者在寫此插件時,使用了很多優秀的編程方法,使得此插件很容易使用和擴展。感謝他們的貢獻!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM