如何在 Handsontable 中使用自定义渲染器对列进行排序?

Posted

技术标签:

【中文标题】如何在 Handsontable 中使用自定义渲染器对列进行排序?【英文标题】:How to sort a column with custom renderer in Handsontable? 【发布时间】:2020-04-03 09:08:32 【问题描述】:

Handsontable 版本 0.34.2(可能无法升级)

我有一个带有 Handsontable 的索引页,其中显示了客户信息。第一列是 id 列。这是一个html链接。如果用户单击它将看到客户的详细信息。表格最初按每条记录的最后修改时间排序。

$('#custInfo').handsontable(
  data: custData,
  colHeaders: ['Cust No', 'Cust Name', ..., 'Last Mod Time'],
  columnSorting: true,
  columns: [ 
     renderer: safeHtmlRenderer , 
    , 
    ...
     type: 'date', 
      dateFormat: 'DD-MM-YYYY by:mm:as' ]
  ...
];

  function safeHtmlRenderer(instance, td, row, col, prop, value, cellProperties) 
    var escaped = Handsontable.helper.stringfy(value);
    td.innerHtml = escaped;
    return td;
  ;

屏幕上的表格是这样的:

261 玛丽 30-10-2018 17:30:17

83 保罗 12-12-2018 09:13:48

如果单击第一列以升序排序,则仅按字母顺序排序。即 '261' 在 '83' 之前。

如何按客户编号排序(而不是下面的链接)?

【问题讨论】:

【参考方案1】:

看起来 *** 中很少有问题得到解答。所以让我回答我自己的问题。

事实证明,列是否具有自定义渲染器并不重要。重要的是您提供的比较功能

请注意以下适用于 0.34.2 版本(最新版本,版本 7 不起作用)

回复:Easy Ways to Sort Different Types of Data in Your App(谢谢这个博客救了我。)

使用 0.34.2 版本,参考页面中的所有示例都可以完美运行。

a[0] = 行索引

a[1] = 值

如果第一行中的 CustNo 是 '178',则 a[1] 是链接。

linkA1 是从 a[1] 拆分出来的字符串数组。

linkA2 = 178

linkA2[0] = 178(但这个仍然是一个字符串)

CustNoA = parseInt(linkA2[0]) 返回一个整数进行数字比较。

columns: [
 data: 'CustNo',
  renderer: safeHtmlRenderer,
  sortFunction: function(sortOrder) 
    return function(a, b) 
      var linkA1 = a[1].split(">");
      var linkA2 = linkA1[1].split("<");  // linkA1[1] => '178</a'
      var CustNoA = parseInt(linkA2[0]);  // linkA2[0] => '178'

      var linkB1 = b[1].split(">");
      var linkB2 = linkB1[1].split("<");
      var CustNoB = parseInt(linkA2[0]);

      if (CustNoA < CustNoB) 
        return sortOrder ? -1 : 1;
      

      if (CustNoA > CustNoB) 
        return sortOrder ? 1 : -1;
      

      return 0;
    
  

【讨论】:

以上是关于如何在 Handsontable 中使用自定义渲染器对列进行排序?的主要内容,如果未能解决你的问题,请参考以下文章

计算不适用于 Handsontable 中使用 AJAX 的自定义单元格渲染

自定义渲染器未应用于 Table 渲染 handsontable

自定义渲染器功能在 Handsontable 插件中不起作用

自定义单元格渲染器操作未在 handsontable 中触发

创建handsontable后添加自定义单元格

如何在handsontable的单元格内添加自定义按钮?