2016-06-10 86 views
1

我使用datatables顯示若干信息和按鈕。 這是用於初始化數據表Datatables每5秒更新一列

if (! $.fn.DataTable.isDataTable('#datatableTable')) { 
     datatableTable = $('#datatableTable').DataTable({ 
      responsive: true, 
      columnDefs: [ 
         { "width": "25%", "targets": 4}, 
         { 
          targets: [4,5,6], 
          //set priority to column, so when resize the browser window this botton stay on the screen because have max priority 
          visible: (document.getElementById('role').value == '[ROLE_ADMIN]' || document.getElementById('role').value == '[ROLE_FLEET_ENG]' 
           || document.getElementById('role').value == '[ROLE_SUPPLIER]'), 
          responsivePriority: 1, 
          orderable: false, 
          searchable: false, 
         }, 
         ... 
         ], 
         //fix problem with responsive table 
         "autoWidth": false, 
         "ajax":{ 
          "url": "datatable/" + $("#selectedCar").val(), 
          "dataSrc": ... 
            return json.result.data;            
          }, 
          "error": function (xhr, error, thrown) { 
           window.location.href = "/DART/500"; 
          } 
         }, 
         "columns": [ 
            .... 
            {data:null, render: function (data, type, row) { 
             var datId="deleteDat"+row.idAcquisition; 
             if (row.datUploaded){ 
              return '<button type="button" class="btn btn-danger" name="deleteDat" target="'+row.idAcquisition+'" id="'+datId+'" data-toggle="modal"' 
              +'data-target="#deleteDatModal">Delete</button>' 
             }else 
              return '<button type="button" class="btn btn-danger" name="deleteDat" target="'+row.idAcquisition+'" id="'+datId+'" data-toggle="modal"' 
              +'data-target="#deleteDatModal" disabled>Delete</button>'           
            }, 
            ], 
            "fnDrawCallback": function(data, type, row, meta) { 
             //Initialize checkbox for enable/disable user 
             $("[name='my-checkbox']").bootstrapSwitch({size: "small", onColor:"success", offColor:"danger"}); 
            }, 
     }); 
    } 
    else { 
     datatableTable.ajax.url("datatable/" + $("#selectedCar").val()).load(); 
    } 

第5列(從0開始)具有按鈕的JavaScript,每個按鈕可被禁用或啓用依賴於datUploaded布爾值。 如果用戶加載文件,這個變量會發生變化,但是這個值已經在異步任務之後設置,所以我不知道在我的JavaScript何時該任務結束。

我以爲每5秒鐘只更新一次這一欄,但我該怎麼辦呢? 我發現datatableTable.column(5).cells().invalidate().render()但我收到一個錯誤(第0行未知參數「isShow」),更新不起作用。 你能幫我嗎?謝謝

+0

能否請您剝離下來你的示例代碼實際問題的部分(S) – fast

+0

現在是更好?我認爲問題是「fnDrawCallback」和說明更新列 – luca

+0

你說「設置異步任務後,所以我不知道在我的JavaScript何時結束」,但你可以傳遞.load()回調到在ajax調用終止後執行,所以你實際上可以知道任務結束的時間。 – lud1977

回答

0

正如我在評論中所說的,您可以傳遞.load()一個回調函數,當ajax請求完成時它會自動調用。在此回調中,您可以根據需要更新您的表格。更新表格後,請記得致電datatableTable.draw();應用更改。

我不認爲invalidate()和render()是必要的。

所以你else分支將類似於

datatableTable.ajax.url("datatable/" + $("#selectedCar").val()).load(function() { 
    /* 
    ...do something to the table... 
    */ 

    datatableTable.draw(); 
}); 
+0

異步任務(Spring)在服務器上,我應該每5秒調用一次datatable.draw()?我想只更新該列,而不是所有的表,否則我可能會使用datatableTable.ajax.reload(); – luca

+0

對不起,我從理所當然的你指的是ajax調用。是的,如果任務在服務器上獨立於腳本並行執行,那麼您需要輪詢服務器以查找結果。你有可以打電話來獲取更新信息的網址嗎? – lud1977

+0

我有所有的表的URL,更新是datUploaded爲true或false。我無法更新所有表格,因爲用戶可能會加載信息或進行其他操作 – luca