此示例基于此链接https://datatables.net/forums/discussion/40613/datatable-jquery-server-side-with-adobe-cold-fusion-and-sql-server我正在使用数据表版本1.10
在第一页加载时,所有数据均已成功加载到#formsTable中但是单击排序,搜索和分页时,它将无法正常工作。它只是挂在'processing ..'
pageA.cfm(仅在此处显示脚本部分...)
<script type="text/javascript">
$(document).ready(function(){
$('#formsTable').DataTable({
processing:true,
serverSide:true,
ajax:{
url:'pageB.cfm'
},
columns:[
{title: "id",data:'id'},
{title: "Name",data:'name'},
{title: "Emp.No",data:'empno'},
{title: "IC",data:'ic'}
]
})
})
</script>
pageB.cfm(服务器端)
<cfcontent reset="true">
<cfset listColumns = "id,emp_no,emp_name,number_id2" />
<cfset sIndexColumn = "id" />
<cfparam name="url.sEcho" default="1" type="integer" />
<cfparam name="url.iDisplayStart" default="0" type="integer" />
<cfparam name="url.iDisplayLength" default="10" type="integer" />
<cfparam name="url.sSearch" default="" type="string" />
<cfparam name="url.iSortingCols" default="0" type="integer" />
<!--- query data --->
<cfquery datasource="hrms" name="qFiltered">
select id,emp_no,emp_name,number_id2 from employee
<cfif len(trim(url.sSearch))>
Where
(
<cfloop list="#listColumns#" index="thisColumn">
<cfif thisColumn neq listFirst(listColumns)>
OR
</cfif>
#thisColumn# LIKE <cfqueryparam cfsqltype="CF_SQL_VARCHAR" value="%#trim(url.sSearch)#%" />
</cfloop>
)
</cfif>
<cfif url.iSortingCols gt 0>
ORDER BY
<cfloop from="0" to="#url.iSortingCols-1#" index="thisS">
<cfif thisS is not 0>, </cfif>
#listGetAt(listColumns,(url["iSortCol_"&thisS]+1))#
<cfif listFindNoCase("asc,desc",url["sSortDir_"&thisS]) gt 0>
#url["sSortDir_"&thisS]#
</cfif>
</cfloop>
</cfif>
</cfquery>
<!--- query data count --->
<cfquery dbtype="query" name="qCount">
SELECT COUNT(#sIndexColumn#) as total
FROM qFiltered
</cfquery>
<!--- Output --->
{"sEcho": <cfoutput>#val(url.sEcho)#</cfoutput>,
"iTotalRecords": <cfoutput>#qCount.total#</cfoutput>,
"iTotalDisplayRecords": <cfoutput>#qFiltered.recordCount#</cfoutput>,
"aaData": [
<cfoutput query="qFiltered" startrow="#val(url.iDisplayStart+1)#" maxrows="#val(url.iDisplayLength)#">
<cfif currentRow gt (url.iDisplayStart+1)>,</cfif>
{
"id":#SerializeJSON(qFiltered.currentrow)#,
"name":#SerializeJSON(qFiltered.emp_name)#,
"empno":#SerializeJSON(qFiltered.emp_no)#,
"ic":
<cfif trim(qFiltered.number_id2) neq '[empty string]'>
#SerializeJSON(qFiltered.number_id2)#
<cfelse>
""
</cfif>
}
</cfoutput> ] }
我被困在这里,似乎pageB.cfm上缺少某些内容?
是的,很遗憾,您正在datatables.net上查看的代码示例适用于旧数据表。在数据表1.10.x下,您将必须使用版本1.10在返回的json结构中期望的升级密钥。看起来您已经用新参数更新了pageA.cfm,但是您还需要在pageB.cfm中更新服务器端返回参数。
这里是升级到1.10版https://datatables.net/upgrade/1.10的指南
这里是服务器端1.10 https://datatables.net/manual/server-side的新参数的指南>
您必须对pageB.cfm进行的代码修改是
sEcho
更改为draw
iTotalRecords
更改为recordsTotal
iTotalDisplayRecords
更改为recordsFiltered
aaData
更改为data
data
,因为数据表需要数据中的数组数组,在ColdFusion对其进行序列化后,可以在DATA
键中找到它。pageB.cfm(我仅从“输出”向下提取而未修改其上方的代码)。
<!--- Output --->
<cfoutput>
{
"draw": #val(url.sEcho)#,
"recordsTotal": #qCount.total#,
"recordsFiltered": #qFiltered.recordCount#,
"data": #serializeJson(qFiltered, "row").DATA# <!--- Use the "row" option as datatables expects an array of arrays as data. --->
}
</cfoutput>