前接jQuery Plugin : DataTables (4)
這裡開始的思路跟我早期的想法不一樣,主要原因是在DataTables call ajax 的時刻。
對我先前的BaseCRUD模式而言,在init時就會自DB取得第一頁的資料以供顯示。
如果透過DataTables來處理,就代表不需要在init階段處理這部份。
但無論如何,Search Form的存在還是必要的,DataTables第一次找回來的資料也必需符合Form初始化的選項;也就代表DataTables要能加入目前現有Form的欄位做為參數。
第一步還是先要訂個Form吧,並將submit改掉,改用button呼叫javascript。因為DataTables的聯絡對象是用“sAjaxSource“指定的,所以Form的action就沒有作用了。
<form id="myform"> <table> <tr><td>NAME:</td><td><input type="text" name="name" /></td></tr> <tr><td>ID:</td><td><input type="text" name="id" /></td></tr> <tr><td>PHONE:</td><td><input type="text" name="phone" /></td></tr> <tr><td colspan="2"><input id="btnSearch" type="button" value="Search" onclick="disTable.fnDraw();"/></td></tr> </table> </form>至於disTable.fnDraw()就稍後再解釋。
第二步就要修改DataTables的呼叫,加入fnServerParams。
"fnServerParams": function ( aoData ) {
$.merge(aoData, $("#myform").serializeArray());
}
藉用jQuery.merge(),將Form裡的欄位資料加入DataTables ajax呼叫參數中。
第三步為了讓Button能觸發DataTables的更新,所以必需保留被DataTables enhanced 過的變數,然後以var_enhanced.fnDraw();來更新資料修改過的javascript 大約如下
<script type="text/javascript">
var disTable; //保留被DataTables enhanced 過的變數
$().ready(function() {
disTable = $("#sample").dataTable({
"sPaginationType":"full_numbers",
"bProcessing": true,
"bServerSide":true,
"sAjaxSource": '/jquery/DataTableServlet02',
"fnServerParams": function ( aoData ) {
$.merge(aoData, $("#myform").serializeArray());},
"aoColumns": [
{ "mDataProp": "id" },
{ "mDataProp": "name" },
{ "mDataProp": "phone" }
]
});
});
</script>
再來就是修改Search method用到的參數,與DataTables就無關了。