###### tags: `Datatables`
# 動態DataTables設置
應用在資料來源不固定包含欄位不固定,需要手動作動態更新情況下。
* 需要判斷當前Datatables實體是否已經有存在
* 如果有存在才要進行銷毀程序
以下語法出現**Datatable_ID**為HTML Table元件 ID屬性值
#### Step1. 判斷DataTables實體是否存在
關於Datatables $.fn.dataTable.isDataTable:
https://datatables.net/reference/api/%24.fn.dataTable.isDataTable()
```
if ($.fn.DataTable.isDataTable(Datatable_ID)) {}
```
**$.fn.DataTable.isDataTable(Datatable_ID)**
判斷當前Table是否為DataTable,如果是會回傳true,反之則回傳false。
#### Step2. 進行DataTables實體銷毀
關於Datatables destroy:
https://datatables.net/reference/api/destroy()
```
$(Datatable_ID).DataTable().destroy();
```
#### Step3. 建立DataTables空實體
```
$(Datatable_ID).empty();
```
#### Step4. 重新初始化DataTables
```javascript=
$(Datatable_ID).DataTable({
destroy: true, //每一次修改時銷毀資料
stateSave: false, //表格狀態保存,當頁面刷新時,是否要保存當前表格狀態,不保存狀態便會在刷新時回復到原始狀態
autoWidth: false, //是否要自動調整表格寬度
data: lsit_data,
columns: list_columns
});
```
需要注意以下兩個參數:
* **data**:
此為Server端回傳的JSON資料,為每個欄位內的參數值集合,格式如下:
```
{
'col_1':val1,
'col_2':val2,
'col_3':val3,
.
.
.
}
```
從上面格式來看,可以理解欄位名稱為key,欄位內容為value
```
{
key:value,
key:value,
.
.
.
}
```
* **columns**:
此為Server端回傳的JSON資料,產生DataTables所必要Columns清單包含處理格式,格式是以JSON(前端)或Dict(後端產生),也就是告訴Datatable有幾個欄位,並且欄位名稱是什麼,格式如下:
```
{
"data": "欄位名稱",
"title": "欄位名稱"
},
```
從上面格式來看,可能會混亂掉為什麼兩者的value都是"欄位名稱",實際上把它看成"title"=key、"data"=value,就會明白為甚麼會是這樣格式,key的命名都是固定的必須遵照"title"、"data"命名,因為這是Datatable預設格式。
範例:
假設透過ajax取得data_dict(欄位內資料)和list_columns(欄位資訊)
有一筆 data_dict 如下:
```
{
"Latitude": 18.00,
"Longitude": 23.00,
"Name": "Pune"
}
```
有一筆 list_columns 如下:
```
{
"data": "Latitude",
"title": "Latitude"
},
{
"data": "Longitude",
"title": "Longitude"
},
{
"data": "Name",
"title": "Name"
},
```
當Datatables讀取第一筆data_dict時,根據內部的欄位資料,key值會跟list_columns內key:data相對應,那麼此data value就會知道要顯示在哪一個欄位內。
data_dict['Latitude'] --> list_columns['data'],知道要對應在哪一個欄位
完整語法
---
Html
```htmlmixed=
<table id="demo_table" class="display table-bordered table table-responsive table-hover" style="width:100%;">
<thead></thead>
</table>
```
JQuery
```javascript=
let Datatable_ID = "#demo_table";
$.ajax({
url: "Your data required api",
type: "POST",
dataType: "json",
data: JSON.stringify({
arg1: val1,
arg2: val2,
}),
success: function (res) {
if ($.fn.DataTable.isDataTable(Datatable_ID)) {
$(Datatable_ID).DataTable().destroy();
$(Datatable_ID).empty();
}
$(Datatable_ID).DataTable({
destroy: true, //每一次修改時銷毀資料序
stateSave: false, //表格狀態保存,當頁面刷新時,是否要保存當前表格狀態,不保存狀態便會在刷新時回復到原始狀態
autoWidth: false, //是否要自動調整表格寬度
data: res.lsit_data,
columns: res.list_columns,
});
},
error: function (res) {},
});
```