我在订购包含HTML的列时遇到问题。在1.10的文档中说明,默认情况下应该这样做,但事实并非如此。然后我查看了1.10的新功能,并看到如果同一列中的每个TD元素都有“数据顺序”属性,则可以通过所述属性进行排序。完善!问题是,我无法让它发挥作用。
奇怪的是,当页面是静态时,它们具有此示例的示例正在按预期工作,但不是在动态加载数据和表时。
我正在使用以下选项和更改来启动表以添加属性。失效是为了告诉Datatables它需要重绘它(我看到它需要在某处):
"createdRow": function ( row, data, index ) {
if ( data[6] ) {
cell = $('td', row).eq(6);
value = cell.text();
if(value == "Ej fakturerad") {
cell.attr('data-order', 1);
}
else if(value == "Nej") {
cell.attr('data-order', 2);
}
else if(value == "Kredit") {
cell.attr('data-order', 3);
}
else if(value == "Ja") {
cell.attr('data-order', 4);
}
}
oTable
.row( index )
.invalidate()
.draw();
},
我正在使用Laravel项目中Chumper / datatables的作曲家包实现此DataTable,这意味着数据源是Ajax,并使用服务器端处理。
提前致谢!
答案 0 :(得分:6)
<强>原因强>
通过查看DataTables源代码,似乎只在表初始化期间读取HTML5 data-
属性,并且仅针对静态数据。
<强>解强>
解决方案#1
对于服务器端处理,您可以考虑发送一个值以与值一起排序,以便仅在特定单元格的单元格中显示。有关详细信息,请参阅Orthogonal data example。
基本上,对于如下结构的行数据:
{
"name": "Tiger Nixon",
"position": "System Architect",
"salary": "$3,120",
"start_date": {
"display": "Mon 25th Apr 11",
"timestamp": "1303682400"
},
"office": "Edinburgh",
"extn": "5421"
}
DataTables初始化代码应为:
$(document).ready(function() {
$('#example').dataTable( {
ajax: "data/orthogonal.txt",
columns: [
{ data: "name" },
{ data: "position" },
{ data: "office" },
{ data: "extn" },
{ data: {
_: "start_date.display",
sort: "start_date.timestamp"
} },
{ data: "salary" }
]
} );
} );
在这种情况下,start_data.display
将显示在表格中,但start_data.timestamp
将用于排序。
解决方案#2
或者,您可以使用columns.render属性定义一个函数来确定要动态排序的值,例如:
$('#example').dataTable({
"columnDefs": [{
"targets": 6,
"data": "field_name",
"render": function (data, type, full, meta) {
if(type === 'sort'){
if(data === "Ej fakturerad") {
data = 1;
} else if(data === "Nej") {
data = 2;
} else if(data === "Kredit") {
data = 3;
} else if(data === "Ja") {
data = 4;
}
}
return data;
}
}]
});