从 json 数据渲染表格后,如何根据 Datatables.js 中的条件为每个单元格着色? [复制]

Posted

技术标签:

【中文标题】从 json 数据渲染表格后,如何根据 Datatables.js 中的条件为每个单元格着色? [复制]【英文标题】:How do i color each cell based on condition in Datatables.js after rendering the table from json data? [duplicate] 【发布时间】:2019-05-14 10:07:23 【问题描述】:
var dataset = [];
var columns = sfdata.columns

sfdata.data.forEach(function (item,index) 
    var n2 = item.items
    dataset.push(n2)
);

$(document).ready(function() 
    $('#example').DataTable(
        data: dataset,
        columns: [
             title: "index" ,
             title: "Name" 

        ]
    );
);

所以我在 spotfire 中创建了默认表,现在的问题是我如何根据条件(如果数据 [2] > 10 则背景颜色为“红色”)为列中的值着色。我实例化它错了吗?如何让它工作?

【问题讨论】:

您可以通过编辑您的问题来使用示例数据创建 sn-p 吗? 在列定义中,您可以添加class 属性,也可以使用rowDrawCallback 来实现同样的效果 【参考方案1】:

您是否尝试将createdRow 添加到DataTable() 调用中?

$("#example").DataTable(
  "data": dataset,
  "columns": [
     "title": "index" ,
     "title": "Name" 
  ],
  "createdRow": (row, data, dataIndex) => 
    if(data[2] >  10)
    
      $(row).addClass("redClass");
    
  
);

在 CSS 中:

.redClass

  background-color: red;

这直接来自DataTables documentation。

【讨论】:

【参考方案2】:

如果您想根据列设置特定单元格的样式,您必须使用带有渲染选项的 columnDefs 作为回调,目标是指您想要控制单元格的列(您也可以查看here )。

所以代码应该是这样的:

  var dataSet = [
["Tiger Nixon", 1, "Edinburgh", "5421", "2011/04/25", "$320,800"],
["Garrett Winters", 12, "Tokyo", "8422", "2011/07/25", "$170,750"],
["Ashton Cox", 4, "San Francisco", "1562", "2009/01/12", "$86,000"],
["Cedric Kelly", 5, "Edinburgh", "6224", "2012/03/29", "$433,060"],
["Airi Satou", 23, "Tokyo", "5407", "2008/11/28", "$162,700"],
["Brielle Williamson", 54, "New York", "4804", "2012/12/02", "$372,000"],
["Herrod Chandler", 2, "San Francisco", "9608", "2012/08/06", "$137,500"]
  ];

var columnDefs = [
   title: "Name"
  , 
    title: "Position"
  , 
    title: "Office"
  , 
    title: "Extn."
  , 
    title: "Start date"
  , 
    title: "Salary"
  ];

var myTable;

myTable = $('#example').DataTable(
   data: dataSet,
   columns: columnDefs,
   columnDefs: [
     targets: 1, // this means controlling cells in column 1
     render: function(data, type, row, meta)  
       if (data > 10)  // here is your condition
         return '<div class="red-color">' + data + '</div>';
        else 
         return data;
       
     
   ]
 );

这是一个有效的snippet

【讨论】:

如何给多列条件? columnDefs 接受一个对象数组,你可以认为每个对象代表一列,你只需要改变目标数。我已经更新了sn-p 你可以看看here【参考方案3】:

你可以使用columnDefs来实现你想要的。

targets 是您要过滤掉的列号,render 是要在该列被渲染时触发的事件。所以,你有了你想要的数据,你可以根据数据过滤掉结果并应用background-color

这里是演示。

var dataSet = [
  index: 1,
  name: "test"
, 
  index: 2,
  name: "test2"
, 
  index: 3,
  name: "test3"
];


$(document).ready(function() 
  $('#example').DataTable(
    data: dataSet,
    columns: [
        data: "index"
      ,
      
        data: "name"
      
    ],
    columnDefs: [
     targets : [0],
      render: function(data, type, row) 
      
        if(row.index>2)
          return "<div style='background-color:red'>"+data+"<div>";
        
        return data;
      
    ]
  );
);
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://cdn.datatables.net/1.10.18/js/jquery.dataTables.min.js"></script>
<link href="https://cdn.datatables.net/1.10.18/css/jquery.dataTables.min.css" rel="stylesheet" />
<table id="example" class="display" ></table>

【讨论】:

【参考方案4】:

$(document).ready(function() 
   var table = $('#example').DataTable(
      'ajax': 'https://api.myjson.com/bins/qgcu',
     "columnDefs": [ 
        "targets":3,
        "render": function ( data, type, row, meta ) 
         var highlight="";
         if(data==5407 || data == 1314)highlight="link"; // Put your conditions here
          return '<span class="'+highlight+'"><i class="fa fa-heart" aria-hidden="true"></i> '+data+'</span>';
        
   ],
  "initComplete": function(settings, json) 
    $(".link").parent().addClass("link");
  
   );  
  
);
.link
  color:white;
  background-color:red;
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
<script src="https://cdn.datatables.net/v/dt/dt-1.10.12/datatables.min.js"></script>
<script src="https://cdn.rawgit.com/ashl1/datatables-rowsgroup/fbd569b8768155c7a9a62568e66a64115887d7d0/dataTables.rowsGroup.js"></script>
<link href="https://cdn.datatables.net/v/dt/dt-1.10.12/datatables.min.css" rel="stylesheet"/>
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.6.1/css/all.css" integrity="sha384-gfdkjb5BdAXd+lj+gudLWI+BXq4IuLW5IT+brZEZsLFm++aCMlF1V92rMkPaX4PP" crossorigin="anonymous">
<h3>jQuery DataTables - ROWSPAN in table body TBODY</h3>

<hr><br>
    
<table id="example" class="display" cellspacing="0" >
   <thead>
      <tr>
         <th>Name</th>
         <th>Position</th>
         <th>Office</th>
         <th>Extn.</th>
         <th>Start date</th>
         <th>Salary</th>
      </tr>
   </thead>
   <tfoot>
      <tr>
         <th>Name</th>
         <th>Position</th>
         <th>Office</th>
         <th>Extn.</th>
         <th>Start date</th>
         <th>Salary</th>
      </tr>
   </tfoot>
</table>

使用column.render 来实现这一点。希望这会有所帮助。

【讨论】:

谢谢。但我无法使用“Ajax”属性提取数据。 改用数据集,我从远程位置获取数据。 还有一件事,你知道如何在单元格中添加图标吗?我尝试使用 bootstrap css 但它不起作用,如果你有任何工作可以通过 CDN 传递给我吗?你是怎么做到的? @ShricharanArumugam 使用字体真棒 @ShricharanArumugam 我用图标更新了答案,请检查

以上是关于从 json 数据渲染表格后,如何根据 Datatables.js 中的条件为每个单元格着色? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

根据JSON对象动态加载表格--大数据量

如何在单元格渲染后检查表格视图上的复选标记图标(附件视图)?

如何从动态列表中为 Vue 中的 API 响应创建列表渲染 JSON?

根据用户输入从连接的 JSON 字符串中渲染多个 Pandas 的数据帧

Layui的数据表格增删改,后端回传json格式封装

layui 利用ajax冲获取到json 数据后 怎样进行渲染