数据表ajax按方法排序

Posted

技术标签:

【中文标题】数据表ajax按方法排序【英文标题】:Datatables ajax sort by method 【发布时间】:2017-12-11 23:17:26 【问题描述】:

我有一个与 will_paginate 一起使用的基本数据表。

<table id="users" class="display" data-source="<%= url_for(:controller => "/account", :action => :paginate, :format => :json) %>">
  <thead>
    <tr>
      <th>First Name</th>
      <th>Last Name</th>
      <th>Email</th>
      <th>Role</th>
    </tr>
  </thead>
  <tbody>
  </tbody>
</table>

jQuery 是

<script type="text/javascript">
    jQuery(function() 
      return $('#users').DataTable(
        processing: true,
        serverSide: true,
        ajax: $('#users').data('source'),
        columns : [
             data: "first_name" ,
             data: "last_name" ,
             data: "username" ,
             data: "role" 
        ]
      );
    );
</script>

虽然大部分工作都非常好,包括列搜索,但我的角色列却没有。

虽然其他所有内容都是我使用 SQL 查询的属性,但角色是一个方法调用。

def role
  return "admin" if self.admin?
  return "manager" if self.manager?
  return "user"
end

这反过来不适用于列排序。

话虽如此,有没有办法将 will_paginate 和 datatables 与 ajax 一起使用来使用方法输出的自定义排序?我尝试在列上使用data-order,但似乎不是这样。

【问题讨论】:

【参考方案1】:

我使用 will-paginate 有一段时间了,但我停止使用它。尝试只使用 datatables 而不使用分页,因为它内部有分页。

这是代码示例

<script type="text/javascript">     
        // DO NOT REMOVE : GLOBAL FUNCTIONS!
        $(document).ready(function() 
                var responsiveHelper_dt_basic = undefined;
                var responsiveHelper_dt_basic2 = undefined; 
                var breakpointDefinition = 
                    tablet : 1024,
                    phone : 480
                ;
                $('#users_table').dataTable(
                    "sDom": "<'dt-toolbar'<'col-xs-12 col-sm-6'f><'col-sm-6 col-xs-12 hidden-xs'l>r>"+
                        "t"+
                        "<'dt-toolbar-footer'<'col-sm-6 col-xs-12 hidden-xs'i><'col-xs-12 col-sm-6'p>>",
                    "autoWidth" : true,
                    "preDrawCallback" : function() 
                        // Initialize the responsive datatables helper once.
                        if (!responsiveHelper_dt_basic) 
                            responsiveHelper_dt_basic = new ResponsiveDatatablesHelper($('#users_table'), breakpointDefinition);
                        
                    ,
                    "rowCallback" : function(nRow) 
                        responsiveHelper_dt_basic.createExpandIcon(nRow);
                    ,
                    "drawCallback" : function(oSettings) 
                        responsiveHelper_dt_basic.respond();
                    ,
                    "iDisplayLength": 50
                );                     
        )
</script>

【讨论】:

如果没有服务器端分页,记录大于 1000 的数据表速度非常慢... 有不同的方法可以减少响应时间,例如批量查找或使用您需要查看的数据和计算进行视图。请参阅这篇关于rails中数据库视图的文章melsatar.blog/2017/05/27/… 问题不在于服务器端,数据表是非常占用内存的客户端。我可以在不到 2 秒的时间内生成 10,000 条记录,但客户端将需要超过 30 秒的时间才能将数据表元素附加到其上。 好的,我在一个页面中测试了超过 3000 条记录,其中列出了很多关系,并且它具有可接受的响应时间,甚至没有视图,并且还显示了更多信息。我同意您的观点,如果您在客户端加载数据时出现超时错误,这将是一个问题。

以上是关于数据表ajax按方法排序的主要内容,如果未能解决你的问题,请参考以下文章

按数据类型而不是来自 AJAX 的格式化字符串对 DataTables 中的列进行排序

数据表ajax排序

MVC 5 排序和过滤数据

DataTables 时刻按自定义格式排序

js怎么实现根据后台回传的数据对商品进行排序?

按下拉列表对视图进行排序