Jquery Datatables 列渲染和排序

26

我正在使用包含 MySQL 时间戳列的数据表格,格式为 YYYY-MM-DD HH:MM:SS。我的表格最初按照此列进行排序。Datatables 可以正确自动检测时间戳格式并进行适当的排序。

现在,我尝试更改此列的外观使其更加用户友好,但不影响其排序方式。因此,我使用 columns.render 功能,如下所示:

{
        "data":"created_at",
        "name":"date",
        "visible":true,
        "title":"Date Created",
        "render": function(data, type, full, meta){
                var date = new Date(data);
                var options = {year: "numeric", month: "long", day: "numeric"};

                return date.toLocaleDateString('en-US', options);
        }
}

一旦我这样做,排序就不再正常工作。我原本以为render函数只会影响数据的显示,但它仍然应该根据该行数据对象上的基础数据进行排序。我正在尝试使用的文档是 (http://datatables.net/reference/option/columns.render)。

有人知道如何根据实际时间戳进行排序,但显示更友好的日期吗?

2个回答

41
我想我懂了。我只需要告诉渲染函数只对“display”类型进行操作即可:
{
        "data":"created_at",
        "name":"date",
        "visible":true,
        "title":"Date Created",
        "render": function(data, type, full, meta){
                if(type == "display"){
                        var date = new Date(data);
                        var options = {year: "numeric", month: "long", day: "numeric"};

                        return date.toLocaleDateString('en-US', options);
                }

                return data;
        }
},

2
它在文档中,但很容易被忽视:"该函数可能会被多次调用"。 - Robert K. Bell
出错的原因是当type有时候是"type",你希望在这种情况下返回初始的data。按这种逻辑来做更有意义。 - Claudiu

0
如果这是一个服务器端的datatable,你可以在它被传递之前编辑一个json。在新的datatables中,可以在ssp.class.php的开头编辑,如果你在使用旧版本,请告诉我。 注意:在新的datatables中,有一个内置函数叫做formatter,可以做到同样的效果,但你也可以像这样使用自定义函数。
if ($j == 6) {
  if ($data[$i][$columns[$j]['db']] == 1) {
      $data[$i][$columns[$j]['db']] = '<label class="btn-danger disabled btn">Stopped</label>';
  } else {
      $data[$i][$columns[$j]['db']] = '<label class="btn-success disabled btn">Running</label>';
  }

在这里,我只是将我的数据库中的0和1编辑为标签“已停止”和“正在运行”
你可以像解析日期一样做些事情,并存储重新格式化后的日期


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接