如何让jQuery DataTables对隐藏值进行排序,但搜索显示的值?

我有一个简单的DataTables网格,其中包含日期列。 我在JSON数据集中提供了两个日期值,一个用于显示,另一个专门设计,以便DataTables可以对其进行排序。 我的Web应用程序允许用户选择一堆不同的日期格式,因此需要灵活。

这是DataTables通过sAjaxSource从Web服务器获取的JSON数据。

 { Reports : [ { Date: { Sort = "20101131133000", Display : "11/31/2010 1:30 PM" } }, { Date: { Sort = "20100912120000", Display : "1200 EST 2010-09-12" } }, ] } 

很容易告诉DataTables根据Date.SortValue属性进行排序,并使用fnRender()使Display属性对用户可见。 所以这让我达到目标的一半。

 var dataTableConfig = { sAjaxSource: "/getreports", sAjaxDataProp: "Reports", aoColumns: [ { mDataProp: "User" }, { mDataProp: "Date.Sort", bSortable: true, sName: "Date", bUseRendered: false, fnRender: function (oObj) { return oObj.aData[oObj.oSettings.aoColumns[oObj.iDataColumn].sName].Display; } } ] }; 

这是我的问题。 我想允许用户根据显示的值输入filter(使用DataTables提供的内置filter输入),但他们不能。

例如。 如果用户输入“EST”,则它们将得到零结果,因为数据表基于mDataProp指定的值而不基于fnRender返回的值进行fnRender

任何人都可以帮我弄清楚如何排序和过滤日期列? 谢谢。

这是一个老post,但希望这将有助于其他人来到这里。

在最新版本的DataTables中,不推荐使用bUseRenderedfnRender

mRender是做这种事情的新方法,并且采用略有不同的方法。

您可以通过以下方式解决您的问题:

 ... { mDataProp: "Date.Sort" bSortable: true, sName: "Date", // this will return the Display value for everything // except for when it's used for sorting, // which then it will use the Sort value mRender: function (data, type, full) { if(type == 'sort') return data.Sort; return data.Display } } ... 

我相信由于对DataTables的更新,现有的答案已被弃用。 HTML5支持DataTables可用于轻松对列进行排序的属性。 特别是data-sort属性。 (参见https://datatables.net/examples/advanced_init/html5-data-attributes.html )

我可以轻松地对表格进行排序:

 
Name Age
John Doe 2/1/78 (37 years old)
Jane Doe 12/1/80 (35 years old)

“Age”列包含数字,符号和字母无关紧要,DataTables将使用“data-sort”属性进行排序。

尝试一些不同的方法:

将两列放在表中(我将其称为DateDisplay和DateSort),不要使用渲染函数,只需隐藏DateSort列。 然后在DateDisplay列的aoColumns数组中放置{ "iDataSort": 2 } ,其中2是DateSort列的索引。

在这种情况下,DateDisplay列将显示在原始数据中,filter将由此列完成,但排序将由DateSort列中的值完成。

有关数据表站点或http://www.codeproject.com/KB/scripting/JQuery-DataTables.aspx “配置排序”部分中的iDataSort属性的更多详细信息。

+1 JocaPC

我想通过提醒每个人javascript使用零索引数组来添加JocaPC的答案。

例:

 HiddenSortString(0)| 日期(1)| 一些文字(2)
 .................................................. .................
 1349035566 |  2012年9月30日下午2:06 | 等等等等
 1349118137 |  2012年10月1日下午1:02 | 等等等等
 1349371297 |  2012年10月4日上午11:21 | 等等等等
 .................................................. .................

要使用隐藏字符串对日期字段进行排序,您将使用以下内容。

 $('.mytable').dataTable({ "aoColumns": [{"bVisible": false},{"iDataSort": 0},null] }); 

嗯…而不是经历所有这些严峻的过程只需添加一个隐藏的span与你的“排序依据”到前面:

 2010113113300011/31/2010 1:30 PM 

注意 :这确实意味着他们可以通过隐藏或显示的值进行搜索……这可能是您无法忍受的结果。

由于您已经拥有可排序和可显示格式的数据,因此这是您需要的所有代码。

它将使用Date.Sort进行排序,使用Date.Display进行视觉效果。 这在此处记录 。

 columns: [{ data: 'Date', render: { _: 'Display', sort: 'Sort' } }] 

您必须按隐藏列(排序)对列进行排序。 为此,您必须包含一个包含排序数据的列,隐藏列并按隐藏列对显示列进行排序。

  "aoColumnDefs:[ {"sTitle": "Display", "iDataSort":1, "aTargets":[2]}, {"bVisible": false, "aTargets":[2]} ], aoColumns: [ { mData: "User" }, { mData: "Display"}, { mData: "Sort"} ]