http://datatables.club/manual/server-side.html
服務器處理(Server-side processing)
什麼是服務器模式?
是不是發現在處理太多 DOM 數據或者 AJAX 一次性把數據獲得後,DataTables 表現的不是很滿意?這是肯定的, 因爲 DT 需要渲染,創建 tr/td ,所以數據越多,速度就越慢。 爲了解決這個問題 DataTables 提供了 服務器模式,把本來客戶端所做的事情交給服務器去處理, 比如排序(order)、分頁(paging)、過濾(filter)。對於客戶端來說這些操作都是比較消耗資源的, 所以打開服務器模式後不用擔心這些操作會影響到用戶體驗。
當你打開服務器模式的時候,每次繪製表格的時候,DataTables 會給服務器發送一個請求(包括當前分頁,排序,搜索參數等等)。DataTables 會向 服務器發送 一些參數 去執行所需要的處理,然後在服務器組裝好 相應的數據 返回給 DataTables。
開啓服務器模式需要使用 serverSideOption
和 ajaxOption
ajax不定時一講
選項,進一步的信息,請參考下面的 配置選項。
DT自動請求的參數(Sent parameters)
當開啓了 服務器模式時,DataTables 會發送如下參數到服務器
ps:需要說明的是
- 如果你是 Java 開發者,那麼使用struts2的需要注意,會有錯誤拋出,因爲處理不了類似
columns[i][search][regex]
的變量 - 如果是你 .net 開發者,那麼可能會遇到 maxQueryStringLength 的錯誤
- 如果是你 php 開發者,那麼恭喜你,php天生支持以上參數的解析,自動轉爲數組,好不公平啊
名稱 | 類型 | 描述 |
---|---|---|
draw |
integerJS |
繪製計數器。這個是用來確保Ajax從服務器返回的是對應的(Ajax是異步的,因此返回的順序是不確定的)。 要求在服務器接收到此參數後再返回(具體看 下面) |
start |
integerJS |
第一條數據的起始位置,比如0代表第一條數據 |
length |
integerJS |
告訴服務器每頁顯示的條數,這個數字會等於返回的 |
search[value] |
stringJS |
全局的搜索條件,條件會應用到每一列( |
search[regex] |
booleanJS |
如果爲 |
order[i][column] |
integerJS |
告訴後臺那些列是需要排序的。 |
order[i][dir] |
stringJS |
告訴後臺列排序的方式, |
columns[i][data] |
stringJS |
columns 綁定的數據源,由 |
columns[i][name] |
stringJS |
columns 的名字,由 |
columns[i][searchable] |
booleanJS |
標記列是否能被搜索,爲 |
columns[i][orderable] |
booleanJS |
標記列是否能排序,爲 |
columns[i][search][value] |
stringJS |
標記具體列的搜索條件 |
columns[i][search][regex] |
booleanJS |
特定列的搜索條件是否視爲正則表達式, 如果爲 |
order[i]
和 columns[i]
參數發送到服務器是數組信息:
order[i]
- 是一個數組,定義了多少列要被排序。比如,數組長度爲1,那麼就 只有一個列被排序,否則就是多個列被排序columns[i]
- 是一個數組,定了這個表格裏所有的列
在這兩個情況下, i
is an integer which will change to indicate the array value. In most modern server-side scripting environments this data will automatically be available to you as an array.
服務器需要返回的數據(Returned data)
一旦 DataTables 發送了請求,上面的參數就會傳送給服務器,那麼你需要接受到這些參數並做相應的邏輯處理然後按照下面的格式講組裝好的JSON數據返回 (不是每個參數都需要接受處理,根據自己的業務需要)
名稱 | 類型 | 描述 |
---|---|---|
draw |
integerJS |
必要。上面提到了,Datatables發送的draw是多少那麼服務器就返回多少。 這裏注意,作者出於安全的考慮,強烈要求把這個轉換爲整形,即數字後再返回,而不是純粹的接受然後返回,這是 爲了防止跨站腳本(XSS)攻擊。 |
recordsTotal |
integerJS |
必要。即沒有過濾的記錄數(數據庫裏總共記錄數) |
recordsFiltered |
integerJS |
必要。過濾後的記錄數(如果有接收到前臺的過濾條件,則返回的是過濾後的記錄數) |
data |
arrayType |
必要。表中中需要顯示的數據。這是一個對象數組,也可以只是數組,區別在於 純數組前臺就不需要用 |
error |
stringJS |
可選。你可以定義一個錯誤來描述服務器出了問題後的友好提示 |
除了上面的返回參數以外你還可以加入下面的參數,來實現對錶格數據的自動綁定
名稱 | 類型 | 描述 |
---|---|---|
DT_RowId |
stringJS |
自動綁定到 |
DT_RowClass |
stringJS |
自動把這個類名添加到 |
DT_RowData |
objectJS |
使用 |
DT_RowAttr |
objectJS |
自動綁定數據到 |
如何使用上面的參數,參考下面展示的 數據示例
如何開啓服務器模式(Configuration)
使用服務器模式需要啓用 serverSideOption
選項 , 設置爲 true
,並且配置 ajaxOption
ajax不定時一講
設置url,告訴 DataTables 該 從那裏獲得數據
所以最簡單的服務器模式DT初始化代碼如下所示:
1 2 3 4 5 6 |
|
ajaxOption
ajax不定時一講
可以直接接受一個字符串也可以作爲一個對象使用。作爲對象他就像 jQuery.ajax 配置一樣
比如我要 DataTables 以post
方式發送的請求,代碼如下
1 2 3 4 5 6 7 |
|
在 DataTables 中的 ajax
選項配置詳細參考 ajaxOption
ajax不定時一講
老版(Legacy)
1.9-版中發送給服務器的參數和 1.10+的有所不同。但是Datatables爲1.9-的腳本做了兼容模式, 你可以使用高版本的js兼容低版本的寫法,但是反過來則不行。 舊的是使用 sAjaxSource
而新的是使用 ajaxOption
ajax不定時一講
或者通過設置 0.fn.dataTable.ext.legacy.ajax = true;
1.9版本服務器操作的文檔看請 參考這裏
服務器模式示例數據格式(Example data)
服務器模式處理的例子,返回數組作爲數據源 , 完整例子
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
|
服務器模式例子,返回對象數組作爲數據源 , 完整例子
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
|
服務器模式例子,返回使用對象還包括DT_RowId
和 DT_RowData
(完整例子 )
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
|
Translation from DataTables.net, with permission