【问题标题】:DataTables: Custom Response HandlingDataTables:自定义响应处理
【发布时间】:2014-10-02 09:48:48
【问题描述】:

我开始研究AngularJSDataTables,想知道是否可以自定义DataTables 所期望的响应。目前对 DataTables 插件的期望是这样的:

{
    "draw": 1,
    "recordsTotal": 57,
    "recordsFiltered": 5,
    "data": [...]
}

在服务器端,API 由django-tastypie 处理

服务器的响应是:

{
     meta: {
        limit: 20,
        next: null,
        offset: 0,
        previous: null,
        total_count: 2
     },

     objects: [...]
 }

那么,有没有办法调整 Datatables 插件以接受/映射此响应,或者我必须找到一种方法将预期字段添加到 api?

到目前为止,我已经这样做了:

    var deptTable = angular.element('#deptManagementTable').DataTable({
        processing: true,
        serverSide: true,
        pagingType: "simple_numbers",
        ajax: {
            url: "/client/api/v1/departments/",
            data: function(d) {
                d.limit = d.length;
                d.offset = d.start;
                d.dept_name__icontains = d.search.value;
            },
            dataSrc: function(json) {
                for (var i=0, len=json.objects.length ; i<len ; i++) {
                    json.objects[i].DT_RowId = json.objects[i].dept_id;
                }
                return json.objects;
            }
        },
        aLengthMenu: [
            [5, 25, 50, 100],
            [5, 25, 50, 100]
        ],
        iDisplayLength: 5,
        columns: [
            {
                data: "dept_name"
            },
            {
                data: "dept_created_on",
                render: function ( data, type, full, meta ) {
                    var dateCreated = new Date(data);
                    dateCreated = dateCreated.toLocaleDateString();
                    return dateCreated;
                }
            }
        ]
    });

任何帮助将不胜感激。

在此先感谢:)

【问题讨论】:

    标签: ajax django angularjs datatable tastypie


    【解决方案1】:

    您可以将函数传递给 DataTables ajax option,这将让您在将数据传递给 DataTables 之前完全控制如何获取和映射数据。

    .DataTable({
        serverSide: true,
        ajax: function(data, callback, settings) {
            // make a regular ajax request using data.start and data.length
            $.get('/client/api/v1/departments/', {
                limit: data.length,
                offset: data.start,
                dept_name__icontains: data.search.value
            }, function(res) {
                // map your server's response to the DataTables format and pass it to
                // DataTables' callback
                callback({
                    recordsTotal: res.meta.total_count,
                    recordsFiltered: res.meta.total_count,
                    data: res.objects
                });
            });
        }
    });
    

    上面的解决方案已经用 jQuery DataTables 1.10.4 测试过。


    由于这个问题是用 Angular 标记的,这里有一个解决方案给那些使用 angular-datatables 的人。

    <div ng-controller="testCtrl">
        <table datatable dt-options="dtOptions" dt-columns="dtColumns" class="row-border hover"></table>
    </div>
    

    .controller('testCtrl', function($scope, $http, DTOptionsBuilder, DTColumnBuilder) {
        $scope.dtOptions = DTOptionsBuilder.newOptions()
            .withOption('serverSide', true)
            .withOption('ajax', function(data, callback, settings) {
                // make an ajax request using data.start and data.length
                $http.get('/client/api/v1/departments/', {
                    limit: data.length,
                    offset: data.start,
                    dept_name__icontains: data.search.value
                }).success(function(res) {
                    // map your server's response to the DataTables format and pass it to
                    // DataTables' callback
                    callback({
                        recordsTotal: res.meta.total_count,
                        recordsFiltered: res.meta.total_count,
                        data: res.objects
                    });
                });
            })
            .withDataProp('data'); // IMPORTANT¹
    
        $scope.dtColumns = [
            // your column definitions here
        ];
    });
    

    上述解决方案已使用 angular-datatables 0.3.0 + DataTables 1.10.4 进行了测试。

    ¹ 这里要注意的重要部分是 angular-datatables 解决方案需要 .withDataProp('data') 才能工作,而纯 jQuery DataTables 解决方案没有 data: 'data' 选项。

    【讨论】:

    • 我从谷歌上发现了这个问题,没有任何答案,我挣扎了几个小时才解决了同样的问题,所以这里有一个解决方案供未来的读者参考。
    • 我没有测试过代码,但对我来说似乎是一个很好的解决方案,所以接受答案。非常感谢分享解决方案。
    • 谢谢。我首先使用angular-datatables 对该解决方案进行了编码,并将其转换为您的问题正在使用的常规jQuery DataTables 插件。然后我对其进行了测试并修复了一些问题。我也可以更新答案以添加角度数据表解决方案。
    • 很棒的解决方案,因为这允许将数据表请求绑定到 $http 拦截器,否则需要非角度的解决方法和额外的问题。
    【解决方案2】:

    这个答案非常有用,但在当前(目前为 1.10.12)版本的数据表的上下文中似乎有点过时,这实际上让生活变得更轻松(或至少更具可读性)。

    在当前版本下,您可以在声明中执行类似以下操作(请记住,tasticpie 需要为您要使用的字段设置可过滤和排序选项)。

    您现在可以通过在函数内部执行 data.attr 来访问在 ajax 请求中提交的数据。

    这假设您希望将搜索限制在一个字段,但可以轻松地以与 ajax 函数中的 console.log(data) 相同的方式扩展以查看发送的内容。

    var table = $('#tableName').DataTable({
        "deferRender":true,
        "serverSide": true,
        "ajax": function(data, callback, settings) {
            var sort_column_name = data.columns[data.order[0].column].data.replace(/\./g,"__");
            var direction = "";
    
            if (data.order[0].dir == "desc") { direction = "-"};
    
            $.get('your/tasty/pie/url?format=json', {
                limit: data.length,
                offset: data.start,
                your_search_field__searchattr: data.search.value,
                order_by: direction +sort_column_name
            }, function(res) {
                callback({
                    recordsTotal: res.meta.total_count,
                    recordsFiltered: res.meta.total_count,
                    data: res.objects
                });
            });
        },
        "columns": [
            { "data":"column_1", "orderable": false },
            { "data":"column_2" },
            { "data":"column_3" }
        ],
        "order": [[1, "asc"]]
    });
    

    【讨论】:

      猜你喜欢
      • 2019-08-18
      • 1970-01-01
      • 1970-01-01
      • 2019-06-23
      • 1970-01-01
      • 2023-03-12
      • 2021-03-24
      • 2012-02-22
      • 1970-01-01
      相关资源
      最近更新 更多