jQuery DataTables 呈现列数据

Posted

技术标签:

【中文标题】jQuery DataTables 呈现列数据【英文标题】:jQuery DataTables render column data 【发布时间】:2017-06-18 08:00:58 【问题描述】:

我正在使用 jQuery DataTables 来显示来自 JSON 编码的 php 响应的信息。 JSON 响应包含对象“名称”。 “name”包含“Full Name”、“Last Name”、“ID”。我一直在使用columns 以我想要的方式显示数据,但是我遇到了一个我无法弄清楚的问题。

在下面的代码中,示例 1 工作正常,在按“姓氏”排序时将显示“全名”。但是,示例 2 根本不起作用。所需的输出将包含 html 呈现的显示并按“姓氏”排序。在示例 3 中,显示以我想要的方式呈现,但排序不正确。

有谁知道如何调整示例 2 以输出我正在寻找的内容(渲染和排序的数据)?

var oTable = $('#table').DataTable(
'ajax': 
    url: 'PHP-file-returns-JSON.php',
    type: "POST",
    dataSrc: function ( data ) 
            return data.cols;
        ,       
    data: function(d) 

       ///send additional values to POST
       var frm_data = $('#val1, #val2').serializeArray();
       $.each(frm_data, function(key, val) 
             d[val.name] = val.value;
       );
     
,
'columns':[

        // exapmle 1 - works but not rendered with HTML
         data: 
                _:    "name.Full Name",
                sort: "name.Last Name",
                 
        ,

        // example 2 not working at all
         data: 'name', "render": function ( data, type, row ) 
                return '<span id="'+data.ID+'">'+data.Full Name+'</span>';
            ,
            "sort" : "name.Last Name",
        ,

        // example 3 works fine with HTML rendered display but not sorted
         data: 'name', "render": function ( data, type, row ) 
                return '<span id="'+data.ID+'">'+data.Full Name+'</span>';
             
        ,
]
);

更新:

HERE 是显示我正在使用的数据结构的 JSFiddle。工作示例仅显示按姓氏排序的全名。我试图弄清楚如何使显示包含一个以 ID 作为 id 属性的 span 元素。

【问题讨论】:

从所有示例中我发现问题在于,为了允许数据表的顺序,它们不会在单元格中创建任何额外的标签,那么为什么您尝试只将 id 添加到 td 并且不使用跨度?,用你的例子 1 你能设计一个简单的 JSFiddle 来说明你的用例吗?例如,您的表格是否有 3 列?您可以只使用简单的 JSON 对象作为数据源来模拟 ajax 返回。 @annoyingmouse 我不确定如何使用 JSFiddle 设置 JSON 响应。但是,我的代码示例应该只显示一列,其中包含呈现为 HTML 的全名。我只是展示了 3 个示例,以便人们更好地了解我正在尝试做什么。 【参考方案1】:

原来使用name.Full Name 是行不通的。它必须是 name.FullName 没有空格。这就是最终对我有用的东西。

  'columns': [
         
            "data": "name",                   
            "render": function ( data, type, row ) 
                if(type === 'display')
                    return '<span id="'+data.ID+'">'+data.FullName+'</span>';
                else if(type === 'sort')
                    return data.LastName;
                else
                    return data;
                
            
        
   ]

【讨论】:

【参考方案2】:

如果您需要按姓氏对列进行排序,这应该可以:

$.extend($.fn.dataTableExt.oSort, 
  "last-name-pre": function(a) 
    return $(a).data("lastname");
  ,
  "last-name-asc": function(a, b) 
    return ((a < b) ? -1 : ((a > b) ? 1 : 0));
  ,
  "last-name-desc": function(a, b) 
    return ((a < b) ? 1 : ((a > b) ? -1 : 0));
  
);


$("#example").DataTable(
  "data": data,
  "columns": [
    "title": "Full Name",
    "data": "Full Name",
    "render": function(data, type, row) 
      return $("<span></span>", 
        "text": data,
        "data-lastname": row["Last Name"]
      ).prop("outerHTML");
    ,
    "type": 'last-name'
  ]
);

它正在工作here。您还可以删除渲染函数,只需调整 last-name 函数以拆分全名并返回姓氏:

$.extend($.fn.dataTableExt.oSort, 
  "last-name-pre": function(a) 
    return a.split(" ")[1];
  ,
  "last-name-asc": function(a, b) 
    return ((a < b) ? -1 : ((a > b) ? 1 : 0));
  ,
  "last-name-desc": function(a, b) 
    return ((a < b) ? 1 : ((a > b) ? -1 : 0));
  
);


$("#example").DataTable(
  "data": data,
  "columns": [
    "title": "Full Name",
    "data": "Full Name",
    "type": 'last-name'
  ]
);

这是here。希望对您有所帮助,并且我已正确理解您的要求。

【讨论】:

我添加了一个我正在使用的数据结构的示例。我尝试使用您的代码,但无法正常工作。 "data" 只允许我使用Full Name。它不会让我添加任何 HTML 格式。我正在寻找显示为:&lt;span id="'+ID+"'&gt;'+Full Name+'&lt;/span&gt;' 再试一次,更新 JSFiddle 以输出正确的span。希望对您有所帮助。【参考方案3】:
enter code herefunction Display() 
    $('#xyz').dataTable(
         "bServerSide": true,
            "bSort": false,
           "sAjaxSource": ,
            "lengthMenu": [10, 25, 50, 100],
            "iDisplayLength": 10,
            "bDestroy": true,
            "bFilter": true,
            "bPaginate": true,
            "bInfo": true,
            "sSearch": true,
            "bLengthChange": true,
            "sEmptyTable": "Loading data from server",
            "fnServerData": function (sSource, aoData, fnCallback) 
                $.ajax(
                    "dataType": 'json',
                    "type": "POST",
                    "url": sSource,
                    "data": aoData,
                    "success": fnCallback
                );
            ,
            "columns": [
                
                    "sWidth": "0.5%",
                    "render": function (data, type, row, meta) 
                        return '<a href="javascript:void(0);" User_ID="' + row[0] + 
                            '" Otp_Mobile="' + row[11] + '" IsActive="' + row[12] +

                            '"  onclick="GetEdit(this);"><i class="glyphicon glyphicon-edit"></i></a>';
                    , "targets": 0
                ,

                
                    "sWidth": "0.5%",
                    "render": function (data, type, row, meta) 
                        return '<a href="javascript:void(0);" onclick="DeleteData(' + row[0] + ')"><i class="glyphicon glyphicon-trash"></i></a>';
                    , "targets": 0
                ,
                
                    "sWidth": "2%",
                    "render": function (data, type, row) 
                      return row[2];
                    
                ,

                
                    "sWidth": "2%",
                    "render": function (data, type, row) 
                        return row[1];
                    
                ,
                
                    "sWidth": "2%",
                    "render": function (data, type, row) 
                        return row[5];
                    
                ,
                
                    "sWidth": "2%",
                    "render": function (data, type, row) 
                        return row[7];
                    
                ,
                
                    "sWidth": "2%",
                    "render": function (data, type, row) 
                        return row[12];
                    
                ,

            ],
     );
  

【讨论】:

【参考方案4】:

你可以试试这个:


    data: null,
    title: "Audio",
    render: function (data) 
    return `<a onclick="UpdateRecord('$data.audio_status_id_string','$"Audio"','$data.request_id')">$AudiostatusColor(data.audio_status_id_string)</a>`
                           
                       ,

【讨论】:

以上是关于jQuery DataTables 呈现列数据的主要内容,如果未能解决你的问题,请参考以下文章

第二次渲染后表格列宽发生变化 - JQuery DataTables

如何将自定义列添加到数据表?

具有动态列的数据表

DataTables jQuery:如何使用单元格的值而不是基于正在呈现的值进行搜索?

JQuery DataTables 列自己定义数据类型排序

标题/数据列未与 jQuery dataTables、bootstrap 2.3.2 对齐并启用水平滚动