Ajax

DataTable 的資料基本上可以來自三個不同的位置

  • HTML - 非常適合當您的表格已經存在並已填入資料時。
  • Javascript 陣列 - 當您的資料存在於 Javascript 陣列中時使用
  • Ajax 資料來源

本手冊的這一節將說明如何使用最後一個選項,因為透過 Ajax 載入您的資料可能特別方便 - 例如,透過資料 HTTP API 饋送,或只是將您的表格資料邏輯與您的 HTML 分開。

使用 Ajax 載入資料的另一個優點是,您可以啟用 DataTables 的 deferRender 選項以提升效能 - 當啟用此選項時,將僅在需要在頁面上繪製時才建立 DOM 元素,從而減少首次將資料插入表格時的初始 CPU 負載。

載入資料

DataTables 載入 Ajax 資料的方式很簡單,只需使用 ajax 選項設定應該發出 Ajax 請求的 URL。例如,以下顯示了 Ajax 來源資料的最小配置

$('#myTable').DataTable( {
    ajax: '/api/myData'
} );

JSON 資料來源

當考慮 DataTables 的 Ajax 載入資料時,我們幾乎總是參考 JSON 有效負載 - 也就是說,從伺服器返回的資料採用 JSON 資料結構。這是因為 JSON 衍生自 Javascript,因此自然地與 DataTables 等 Javascript 函式庫配合良好。它也是一種緊湊且易於理解的資料格式,已證明在 Javascript 世界中非常受歡迎。

DataTables 可以使用其他資料格式,例如 XMLYAML,但這些格式需要先轉換為 Javascript 物件表示法 (即 JSON) 才能使用 - 這通常是透過使用 ajax.dataSrc 來完成的。本文檔的其餘部分將僅考慮 JSON。

對於我們的 JSON 資料來源,我們需要兩個關鍵資訊

  • 表格中表示資料列的資料陣列在物件中的位置
  • 每列的資料點在列物件/陣列中的位置。

資料陣列位置

DataTables 需要一個項目陣列來表示表格的資料,其中陣列中的每個項目都是一列。項目通常是一個物件或一個陣列(下面會更詳細地討論) - 因此我們需要做的第一件事是告訴 DataTables 該陣列在資料來源中的位置。

例如,請考慮下面左側顯示的三個 JSON 資料物件,您可以看到三個結構中的每一個都包含相同的資料,用於要在表格中顯示的資料陣列,但該陣列的位置在每個資料物件中都不同。每個都是完全有效的,並且可以在不同的情況下使用 - 沒有單一的「正確方式」!

ajax.dataSrc(即資料來源)選項用於告訴 DataTables 資料陣列在 JSON 結構中的位置。ajax.dataSrc 通常以字串形式給定,指示在 Javascript 物件表示法中的位置 - 即,只需將其設定為陣列所在的屬性名稱即可!空字串是一種特殊情況,它會告訴 DataTables 期望一個陣列(如上面的第一個範例)。

三個資料結構都顯示了它們對應的 DataTables 初始化。

1) 簡單的資料陣列

[
    {
        "name": "Tiger Nixon",
        "position": "System Architect",
        "salary": "$320,800",
        "start_date": "2011/04/25",
        "office": "Edinburgh",
        "extn": "5421"
    },
    ...
]
$('#myTable').DataTable( {
    ajax: {
        url: '/api/myData',
        dataSrc: ''
    },
    columns: [ ... ]
} );

2) 具有 data 屬性的物件 - 請注意,此處顯示的 data 參數格式可以與簡化的 DataTables 初始化一起使用,因為 data 是 DataTables 在來源資料物件中尋找的預設屬性。

{
    "data": [
        {
            "name": "Tiger Nixon",
            "position": "System Architect",
            "salary": "$320,800",
            "start_date": "2011/04/25",
            "office": "Edinburgh",
            "extn": "5421"
        },
        ...
    ]
}
$('#myTable').DataTable( {
    ajax: '/api/myData',
    columns: [ ... ]
} );

// or!

$('#myTable').DataTable( {
    ajax: {
        url: '/api/myData',
        dataSrc: 'data'
    },
    columns: [ ... ]
} );

3) 具有 staff 屬性的物件

{
    "staff": [
        {
            "name": "Tiger Nixon",
            "position": "System Architect",
            "salary": "$320,800",
            "start_date": "2011/04/25",
            "office": "Edinburgh",
            "extn": "5421"
        },
        ...
    ]
}
$('#myTable').DataTable( {
    ajax: {
        url: '/api/myData',
        dataSrc: 'staff'
    },
    columns: [ ... ]
} );

欄資料點

現在 DataTables 知道從哪裡取得資料列的資料,我們還需要告訴它從哪裡取得該列中每個儲存格的資料 - 這是透過 columns.data 選項完成的。

讓我們再次考慮三種不同的資料格式,同樣顯示在左側 - 每個案例中僅顯示一列資料(即為了簡潔起見,它沒有包裝在上面討論的結構中)。

您可以看到,在這三個案例中的每一個案例中,都有相同的資料可用於該列,但 JSON 資料的結構不同。我們使用 columns.data 屬性來告訴 DataTables 從哪裡取得每欄的資料。

與上面討論的 ajax.dataSrc 選項一樣,columns.data 通常以字串形式給定,該字串表示 Javascript 點狀物件表示法中所需資料的位置。也可以以其他形式給定,例如用於存取陣列的索引。

右側顯示了三個資料結構的對應 DataTables 初始化。

1) 資料陣列 - 請注意,陣列選項不需要設定 columns.data 選項。這是因為 columns.data 的預設值是欄索引(即 0、1、2...

[
    "Tiger Nixon",
    "System Architect",
    "$320,800",
    "2011/04/25",
    "Edinburgh",
    "5421"
]
$('#myTable').DataTable( {
    ajax: ...
} );

// or!

$('#myTable').DataTable( {
    ajax: ...,
    columns: [
        { data: 0 },
        { data: 1 },
        { data: 2 },
        { data: 3 },
        { data: 4 },
        { data: 5 }
    ]
} );

2) 資料物件

{
    "name": "Tiger Nixon",
    "position": "System Architect",
    "salary": "$320,800",
    "start_date": "2011/04/25",
    "office": "Edinburgh",
    "extn": "5421"
}
$('#myTable').DataTable( {
    ajax: ...,
    columns: [
        { data: 'name' },
        { data: 'position' },
        { data: 'salary' },
        { data: 'state_date' },
        { data: 'office' },
        { data: 'extn' }
    ]
} );

3) 巢狀物件 - 在這種情況下,請注意在巢狀物件中,我們使用點狀物件表示法 (例如 hr.position) 來存取巢狀資料。透過這種能力,幾乎任何 JSON 資料結構都可以與 DataTables 一起使用

{
    "name": "Tiger Nixon",
    "hr": {
        "position": "System Architect",
        "salary": "$320,800",
        "start_date": "2011/04/25"
    },
    "contact": {
        "office": "Edinburgh",
        "extn": "5421"
    }
}
$('#myTable').DataTable( {
    ajax: ...,
    columns: [
        { data: 'name' },
        { data: 'hr.position' },
        { data: 'hr.salary' },
        { data: 'hr.state_date' },
        { data: 'contact.office' },
        { data: 'contact.extn' }
    ]
} );

選用參數

除了資料列的資料外,DataTables 還可以使用每個資料列的資料來源物件上的以下選用參數,為您執行自動操作

參數名稱 類型 說明
DT_RowId 字串 tr 節點的 ID 屬性設定為此值
DT_RowClass 字串 將此類別新增至 tr 節點
DT_RowData 物件 使用 jQuery data() 方法將物件中包含的資料新增至列,以設定資料,然後也可以用於稍後的擷取(例如,在點擊事件上)。
DT_RowAttr 物件 將物件中包含的資料新增至列 tr 節點作為屬性。物件索引鍵用作屬性索引鍵,而值用作相應的屬性值。這是使用 jQuery param() 方法執行的。請注意,此選項需要 DataTables 1.10.5 或更新版本。

實際範例

DataTables 範例包含許多範例,說明 DataTables 如何讀取 Ajax 載入的資料。

Ajax 設定

為了完整討論我們的 Ajax 載入,值得說明的是,目前 DataTables 不幸地不支援透過 Ajax 進行設定。這將在未來進行審查,但是,JSON 沒有提供表示 Javascript 函式的選項,這在 DataTables 設定中可能非常有用,因此 Ajax 載入的設定無法使用 DataTables 提供的所有選項。