如何忽略角材料表中的NULL值排序

时间:2019-08-16 15:32:36

标签: angular sorting null angular-material mat-table

我正在向表中添加一行,以便添加新记录,并且无论排序标题(asc,desc或无),我都希望将该行保持在顶部。

如果未定义顺序或asc,则该行位于顶部,但是单击desc顺序时,该行将到达底部。

关于如何保持空值(数据源中的新行对象具有用于列排序的空值)始终在顶部的任何想法吗?

订购“无”可以: https://i.stack.imgur.com/J3Ou1.png

Order Asc也可以: https://i.stack.imgur.com/xFolC.png

但是,订单描述不正确: https://i.stack.imgur.com/bsksj.png

3 个答案:

答案 0 :(得分:0)

角度MatSortModule具有一个名为“ deregister”的属性。您可以尝试将此属性添加到要从MatSortables中删除的行中

来源:https://material.angular.io/components/sort/api

答案 1 :(得分:0)

当值为null时,可以通过覆盖排序机制,用在Z之后排序的字符(例如omega(Ω))“替换”它。

this.dataSource.sortingDataAccessor = (item, key) => item[key] || 'Ω';

排序机制将返回键/值对,但是当找不到值时,它将返回omega字符,但是仅用于排序,因此它不会显示在表中

答案 2 :(得分:0)

我有一个类似的问题,那就是“单击排序按钮时忽略空值,以便始终将它们打印在表的末尾”。 我这样解决了这个问题:

  • 忽略MatTableDataSource的sortingDataAccessor方法
  • 检查商品属性值
  • 如果该值为空,则检查排序顺序
  • 按照排序顺序:返回(可能)最高/最低值,以使具有空值的行始终位于表的末尾(在您的情况下,您将反转返回的值)。

以下是代码示例:

this.rankingData = new MatTableDataSource();
this.rankingData.sortingDataAccessor = (item, property) => {
    if(null == item[property]) {
      if("desc" == this.sort.direction) return '\u0000'+'\u0000'+'\u0000';
    return '\uFFFF'+'\uFFFF'+'\uFFFF';
  }
  return item[property];
};