DataTables的columns.render属性

DataTables的一系列文章我在学习中遇到的问题及解决方法的总结,也包含对官方文档的翻译,希望能分享给大家,共同进步

columns.render属性是在DataTables初始化表中需要设置的非常重要的部分

例如初始化一个简单的表格

const stock_history_table = $('#stock_sort_table').DataTable({
            //这样配置后,即可用DT的API来访问表格数据
            "processing": true,
            "serverSide": true,
            "ajax": {
                "url": '<?php echo base_url(""); ?>' + '/' + stockID + '/' + startDate + '/' + endDate ,
                "type": "GET",
                // "async":true,
                "dataSrc": function(result){
            
                    //给行绑定选中事件
                    $('#stock_sort_table tbody').on( 'click', 'tr', function () {
                        if ($(this).hasClass('selected')) {
                            $(this).removeClass('selected');
                        }
                        else {
                            stock_history_table.$('tr.selected').removeClass('selected');
                            $(this).addClass('selected');
                        }
                    } );

                    return result
                }
            },
            columns: [
                {data: "date"},   // 第一列
                {data: "stock_id"},  // 第二列
                {data: "stock_name"},
                {
                    data: "digest",    // 第四列
                    render:function(data,type,row,meta){   // 通过render属性返回不同的样式
                        if (data === "证券买入") {
                            return "<p style='color:red'>" + data + "</p>"
                        } else {
                            return "<p style='color:blue'>" + data + "</p>"
                        }
                    }
                }
            ]
        });

通过ajax获取到的数据如果需要进一步的处理并且对应到相应的列上,就需要对columns属性进行设置。

columns属性中的每一项对应了从左到右的每一列,在上面初始化的表中,第一列就是日期,第二列就是股票名称,以此类推,第三列是股票名称,前三列因为直接将数据展示出来就可以,因此只设置了data属性,data属性值是ajax取回来的数据里面对应的数据(如果需要对取回来的数据进行处理,可以在“ajax”属性中的“dataSrc”属性对应的函数进行处理),上表中通过ajax取回的json数据应该如下所示

[{
"date": "2019-08-12 10:42:04",
"stock_id": "000063",
"stock_name": "中兴通讯",
"digest": "证券买入",
}]

第四列展示的是证券操作,是买入或者卖出等,我们希望如果是买入显示为红色,如果是卖出显示为蓝色,这种显示上的变化通过数据处理是很麻烦的,因此我们通过columns中的render属性对应的函数进行处理,实现功能。(这样也可以对相同的数据进行不同的展示)

以下是官网对于columns.render属性的介绍,我进行了翻译和简化

1. columns.render可以对三种特殊值进行处理
处理方法
undefined 会使用columns.defaultContent的值,如果没有指定默认的内容,那么会报错
null 会使用columns.defaultContent的值,如果没有指定默认的内容,会将单元格显示为空
function 将执行该函数并使用返回的值。从DataTables 1.10.1开始,函数将在与行数据对象相同的范围内执行。这样做的结果是可以使用对象实例作为行的数据源。
2. render属性值的类型为函数时的具体使用方法

render(data,type,row,meta) 各参数的意义如下:

名称 类型 可选 备注
1 data Any no 就是此单元格的值(columns.data)
2 type string no 对这个单元格的值的类型进行过滤
3 row Any no 此单元格所在行的整行数据
4 meta object no 用来存储额外信息(包括row,col,settings),row是本单元格的所在行的index(可以通过row().index()拿到),col是本单元格所在列的index(可以通过column().index()拿到),settings可以用来获取这个表的API实例

注:以上四个参数在官网中写的是不可选,但是我在实际使用中发现是可选的,如果有知道为什么的朋友可以在评论区讨论

3. 开发实例
  • 返回的是从数组对象中获取的以逗号分隔的列表(返回一个字符串)
$('#example').dataTable( {
  "ajaxSource": "sources/deep.txt",
  "columns": [
    { "data": "engine" },
    { "data": "browser" },
    {
      "data": "platform",
      "render": "[, ].name"
    }
  ]
} );
  • 作为一个对象,为不同的类型提取不同的数据
// This would be used with a data source such as:
//   { "phone": 5552368, "phone_filter": "5552368 555-2368", "phone_display": "555-2368", ... }
// Here the `phone` integer is used for sorting and type detection, while `phone_filter`
// (which has both forms) is used for filtering for if a user inputs either format, while
// the formatted phone number is the one that is shown in the table.
$('#example').dataTable( {
  "columnDefs": [ {
    "targets": 0,
    "data": null, // Use the full data source object for the renderer's source
    "render": {
      "_": "phone",
      "filter": "phone_filter",
      "display": "phone_display"
    }
  } ]
} );
  • 如上所述,以phone为对象:
// This would be used with a data source such as:
//   "phone": { "plain": 5552368, "filter": "5552368 555-2368", "display": "555-2368" }
$('#example').dataTable( {
  "columnDefs": [ {
    "targets": 0,
    "data": 'phone',
    "render": {
      "_": "plain",
      "filter": "filter",
      "display": "display"
    }
  } ]
} );
  • 用作从数据源创建链接的函数
$('#example').dataTable( {
  "columnDefs": [ {
    "targets": 0,
    "data": "download_link",
    "render": function ( data, type, row, meta ) {
      return '<a href="'+data+'">Download</a>';
    }
  } ]
} );
  • 显示长字符串的省略号
$('#example').dataTable( {
  "columnDefs": [ {
    "targets": 4,
    "data": "description",
    "render": function ( data, type, row, meta ) {
      return type === 'display' && data.length > 40 ?
        '<span title="'+data+'">'+data.substr( 0, 38 )+'...</span>' :
        data;
    }
  } ]
} );
  • 使用对象实例作为行的数据源
function Person( name, age, position ) {
    this._name     = name;
    this._age      = age;
    this._position = position;
 
    this.name = function () {
        return this._name;
    };
 
    this.age = function () {
        return this._age;
    };
 
    this.position = function () {
        return this._position;
    };
}
 
 
$(document).ready(function() {
    var table = $('#example').DataTable({
        columns: [
            { data: null, render: 'name' },
            { data: null, render: 'age' },
            { data: null, render: 'position' }
        ]
    });
 
    table.row.add( new Person( 'Airi Satou',     33, 'Accountant' ) );
    table.row.add( new Person( 'Angelica Ramos', 47, 'Chief Executive Officer (CEO)' ) );
    table.row.add( new Person( 'Ashton Cox',     66, 'Junior Technical Author' ) );
    table.draw();
} );

更详细的信息可以查阅官网对columns.render的介绍

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,752评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,100评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,244评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,099评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,210评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,307评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,346评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,133评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,546评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,849评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,019评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,702评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,331评论 3 319
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,030评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,260评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,871评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,898评论 2 351

推荐阅读更多精彩内容