【问题标题】:jQuery dataTables server side pagination counter is wrongjQuery dataTables 服务器端分页计数器错误
【发布时间】:2018-03-13 05:45:37
【问题描述】:

我试图每页显示 2 个项目,但是当我检查“下一步”按钮时,它被禁用并且分页计数器只有 1。这是一个屏幕截图:

我的数据库记录中只有 3 个项目,我尝试每页显示 2 个项目。所以分页计数器应该是2,并且下一步按钮不应该被禁用。

这是我的代码:

    $('#transactions').DataTable({
            dom: 'Bfrtip',
            "processing" : true,
            "serverSide" : true,
            "ajax" : {
                url: "/reports/ajax-overall",
                dataSrc: function(json){
                    json['recordsTotal'] = json.total;
                    json['recordsFiltered'] = json.per_page;
                    json['draw'] = 1;
//                    return json;
                    return json.data;
                }
            },
            "columns": [
                { "data": "created_at" },
                { "data": "order_number" },
                { "data": "customer_name" },
                { "data": "payment_method" },
                { "data": "discount" },
                { "data": "tax" },
                { "data": "total_payable_amount" },
                { "data": "customer_paid_amount" },
                { "data" : "" }
            ],
            "columnDefs" : [
                {
                    "render" : function(data,type,row){
                        console.log(row.id);
                        return "<a href='#' class='view-order-details' id='order-details-"+row.id+"'>View Order Details</a>";
                    },
                    "targets" : 8
                },
                {
                    "render" : function(data,type,row){
                        let total = row.total_payable_amount;
                        total = parseFloat(total);
                        total = total.toFixed(2);
                        return numberWithCommas(total);
                    },
                    "targets" : 6
                },
                {
                    "render" : function(data,type,row){
                        let paid_amount = row.customer_paid_amount;
                        paid_amount = parseFloat(paid_amount);
                        paid_amount = paid_amount.toFixed(2);
                        return numberWithCommas(paid_amount);
                    },
                    "targets" : 7
                }
            ],
            buttons: [
                {
                    extend: 'pdf',
                    footer: false,
                    exportOptions: {
                        columns: "thead th:not(.noExport)"
                    }
                },
                {
                    extend: 'csv',
                    footer: false,
                    exportOptions: {
                        columns: "thead th:not(.noExport)"
                    }
                },
                {
                    extend: 'excel',
                    footer: false,
                    exportOptions: {
                        columns: "thead th:not(.noExport)"
                    }
                }
            ]
        });

这是来自服务器的示例响应:

{
    "current_page": 1,
    "data": [
        {
            "id": 2,
            "created_at": "2017-10-01 15:34:30",
            "order_number": "1001",
            "payment_method": "Cash",
            "customer_name": "Michael Jordan",
            "total_payable_amount": "1250.0000",
            "total": "1250.0000",
            "discount": null,
            "tax": null,
            "customer_paid_amount": "1500.0000"
        },
        {
            "id": 3,
            "created_at": "2017-10-01 14:38:47",
            "order_number": "1002",
            "payment_method": "Cash",
            "customer_name": "Kobe Bryant",
            "total_payable_amount": "1250.0000",
            "total": "1250.0000",
            "discount": null,
            "tax": null,
            "customer_paid_amount": "1500.0000"
        }
    ],
    "from": 1,
    "last_page": 2,
    "next_page_url": "http://127.0.0.1:8080/api/reports/all/2017-10-01/2017-10-01?page=2",
    "path": "http://127.0.0.1:8080/api/reports/all/2017-10-01/2017-10-01",
    "per_page": 2,
    "prev_page_url": null,
    "to": 2,
    "total": 3
}

这是我的 Laravel 代码:

$orders = DB::table("orders")
        ->select(
            "orders.id",
            "orders.created_at",
            "orders.order_number",
            "order_payments.payment_method",
            "order_payments.customer_name",
            "order_payments.total_payable_amount",
            "order_payments.total",
            "order_payments.discount",
            "order_payments.tax",
            "order_payments.customer_paid_amount"
        )
        ->leftJoin("order_payments","order_payments.order_id","=","orders.id")
        ->where('orders.created_at','>=',$start_date)
        ->where('orders.created_at','<=',$end_date)
        ->where("orders.has_paid","=",$has_paid)
        ->paginate(2);
    return $orders;

我错过了什么吗?

谢谢。

【问题讨论】:

  • 尝试在 dataSrc 方法中返回一次 json 而不是只返回 json.data。此外,向 json 添加一个属性,例如 json['draw'] = 1;
  • @palaѕн 如果我这样做,表格将是空的。如果我刚刚返回json,那么表格将返回为空。
  • 查看示例here在ajax选项卡中仅以这种格式返回数据,我们不需要在那里设置dataSrc。看看这是否适合你。
  • @palaѕн 好的,顺便说一句,我更新了我的问题以包含服务器的响应。也许这会有所帮助。

标签: javascript jquery laravel pagination datatables


【解决方案1】:

DataTables 不能与 Laravel 的分页输出一起工作。

查看this example,了解如何使用 DataTables 进行服务器大小的处理

【讨论】:

    猜你喜欢
    • 2012-07-18
    • 1970-01-01
    • 2011-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-26
    • 1970-01-01
    • 2014-08-21
    相关资源
    最近更新 更多