DataTable 范围日期时间过滤器

DataTable Range Datetime Filter

我有一个数据表,其中填充了 ajax 响应。在响应中我得到一个字符串日期数据。我可以在数据表上写入该数据,但我无法过滤具有日期范围的数据。我已经尝试了很多方法,但我无法解决这个问题。我的一些尝试我得到“fnDraw()”没有功能或类似这样的错误。如何制作范围过滤器?

JavaScrıpt 代码:

$(document).ready(function () {
  var table = $.ajax({
        type: "GET",
        url: '/History/GetCallbackHistory',
        data: { UserId: document.getElementById("callbackuserid").value },
        dataType: 'json',
        success: function (obj, textstatus) {
            $('#callback_table').DataTable({
                "pagingType": "input",
                "language":
                {
                    "processing": "<div class='loader'>Loading...</div>",
                    "paginate": {
                        "previous": "",
                        "next": ""
                    },
                },
                dom: "<'row'<'container-c'pi<'permuheader'<'refresh-button'>><'tlength'l>>>"
                    + "<'row'>"
                    + "<'row'<'col-sm-12't>r>",
                data: obj,
                columns: [
                    {
                        "data": "Id"
                    },
                    {
                        "data": "DateCallback"
                    },
                    {
                        "data": "callbackId"
                    },
                    {
                        "data": "Task_name"
                    },
                    {
                        "data": "callbackStatus"
                    },
                    {
                        "data": "Point"
                    },
                    {
                        "data": "TransactionType"
                    },
                    {
                        "data": "DateEnd"
                    }
                ]
            });
        },
        error: function (obj, textstatus) {
            alert(obj.msg);
        }
    });
    $("#datepicker_from").datepicker({
        showOn: "button",
        buttonImageOnly: false,
        "onSelect": function (date) {
            minDateFilter = new Date(date).getTime();
            table.fnDraw();
        }
    }).keyup(function () {
        minDateFilter = new Date(this.value).getTime();
        table.fnDraw();
    });

    $("#datepicker_to").datepicker({
        showOn: "button",
        buttonImageOnly: false,
        "onSelect": function (date) {
            maxDateFilter = new Date(date).getTime();
            table.fnDraw();
        }
    }).keyup(function () {
        maxDateFilter = new Date(this.value).getTime();
        table.fnDraw();
    });
});

$.fn.dataTableExt.afnFiltering.push(
    function (oSettings, aData, iDataIndex) {
        if (typeof aData._date == 'undefined') {
            aData._date = new Date(aData[1]).getTime();
        }

        if (minDateFilter && !isNaN(minDateFilter)) {
            if (aData._date < minDateFilter) {
                return false;
            }
        }

        if (maxDateFilter && !isNaN(maxDateFilter)) {
            if (aData._date > maxDateFilter) {
                return false;
            }
        }

        return true;
    }
);

当您像这样使用 jQuery 的 ajax 时:

var table = $.ajax({ ... });

您正在将 jQuery 对象分配给您的 table 变量。您没有success 函数中的 DataTable 分配给 table 变量。

这就是为什么当您尝试使用 table.fnDraw() 时会收到特定错误:您的 table 不是 DataTable。 ajax 调用是 异步的 - 它不会 return 正常代码流中 success 调用的任何内容。

相反,我推荐的最简单的替代方法是重新安排您的代码以使用 DataTables 对 ajax.

的内置支持

在这种新方法中,我们根本不需要使用 jQuery ajax 函数 - 因此我们将其从代码中完全删除。相反,我们这样做:

var table = $('#callback_table').DataTable({
  "ajax": {
    "method": "GET",
    "url": "/History/GetCallbackHistory",
    "data": {
      UserId: document.getElementById("callbackuserid").value
    },
    "dataType": "json",
    "dataSrc": ""
  },
  "pagingType": "input",
  "language": {
    "processing": "<div class='loader'>Loading...</div>",
    "paginate": {
      "previous": "",
      "next": ""
    },
  },
  "dom": "<'row'<'container-c'pi<'permuheader'<'refresh-button'>><'tlength'l>>>" +
    "<'row'>" +
    "<'row'<'col-sm-12't>r>",
  "columns": [{
      "data": "Id"
    },
    {
      "data": "DateCallback"
    },
    {
      "data": "callbackId"
    },
    {
      "data": "Task_name"
    },
    {
      "data": "callbackStatus"
    },
    {
      "data": "Point"
    },
    {
      "data": "TransactionType"
    },
    {
      "data": "DateEnd"
    }
  ]
});

要注意的要点是 ajax 部分:

  "ajax": {
    "method": "GET",
    "url": "/History/GetCallbackHistory",
    "data": {
      UserId: document.getElementById("callbackuserid").value
    },
    "dataType": "json",
    "dataSrc": ""
  },

这是 jQuery ajax 函数的包装器。但它也使用 jQuery 的 ajax 的 DataTables 扩展:dataSrc 选项。此选项取代了旧的 data: obj 选项。它告诉 DataTables 您的 JSON 响应是一个普通数组。

完成此操作后,您的 table 变量将包含一个有效的 DataTables 对象 - 您现在可以使用 table.fnDraw();。但最好使用此函数的现代名称:table.draw();.

如果你有过滤问题,之后,你可以参考官方日期范围过滤示例DataTables date range filter,以确保你的方法与示例的方法相匹配(但使用你喜欢的datepicker控件).