【问题标题】:Angular mat-table : - Sort icon missing on custom sortAngular mat-table : - 自定义排序中缺少排序图标
【发布时间】:2019-06-20 20:56:41
【问题描述】:

当我们按代码对 mat 表进行排序时,mat-sort 图标不显示。如何在单击按钮而不是单击 mat-h​​eader 时进行排序。

StackBlitzzzz Link

【问题讨论】:

  • 能不能说的再具体点,你想达到什么目的?
  • 按代码对数据进行排序后,排序图标不见了。在示例中有两个按钮。需要在单击该按钮时对数据进行排序。

标签: angular mat-table


【解决方案1】:

最初我认为问题很简单,但继续阅读文档和源代码,Angular 材料不提供此功能,通过订阅可以看出它不起作用:

 ngAfterViewInit() {
    this.sort.sortChange.subscribe((x) => {
      console.log(x);
    });
  }

控制台响应将是:

{active: "name", direction: "asc"}

所以会触发列的id并对其进行排序,但图标不会出现。

我提供了 2 个实现,您可以选择适合自己的一个。

解决方案 1:

一个快速的解决方法是强制显示所有图标,但没有太大意义,因为我们想专注于单个列。要做到这一点,只需在 css 中完成:

::ng-deep .mat-sort-header-arrow {
  opacity: 1 !important;
 }

header 上的所有图标将只显示在具有 mat-sort-header 属性的 header 上,并且将在活动列上触发图标更改。

Stackblitz:https://stackblitz.com/edit/mattable-with-custom-sort-etzkcy

解决方案 2:

这有点hacky,所以为了触发图标上的动画,我们需要点击标题。因此,我从 mat-h​​eader-cell 上的组件调用单击事件,但 mat-h​​eader-cell 不可单击,因此我将列名包装在 div 中,以模拟单击

      <mat-header-cell *matHeaderCellDef mat-sort-header>
        <div #position>Position</div>
      </mat-header-cell> 

在组件中,我们需要为所有要模拟点击的displayColumns创建一个viewchildren:

@ViewChild('position') position:ElementRef;
@ViewChild('name') name:ElementRef; 

在您的方法 sortTest(val) 中,我开始变得更加 hacky,因此我切换了在 val 中作为参数传递的字符串的值,以调用右标题上的右键单击,因为 div 的名称和列的比例为 1:1

 switch(val) {
      case "name": { 
        this.name.nativeElement.click()
        this.name.nativeElement.click()            
        break; 
        } 
      case "position": { 
        this.position.nativeElement.click()
        this.position.nativeElement.click()            
        break; 
      }
    } 

我为什么打电话

            this.position.nativeElement.click()

2 次?因为据我了解

    this.sort.active = val;

算作一次点击,但不显示图标,所以我们会按之前的顺序升序返回,以避免我称它为 2 次点击是奇怪的。

在所有这些 hacky 代码之后,我发出了排序

this.sort.active = val;

    this.dataSource.sort = this.sort;
    const sortState: Sort = {active: val, direction: this.sort.direction === 'asc' ? 'desc' : 'asc'};

    this.sort.direction = sortState.direction;
    this.sort.sortChange.emit(sortState); 

我没有找到更好的解决方案,甚至在网上搜索,文档和角度材料的源代码。我发现这样一个问题没有一个回应。

此解决方案的 Stackblitz:https://stackblitz.com/edit/mattable-with-custom-sort-emqkbs

【讨论】:

  • 但是第一个解决方案在第一次点击标题时不起作用。在第二个领带之后才工作
  • 那是因为我们只使图标始终可见,当您第一次单击时状态不会改变。空闲状态是带向上箭头的,当你第一次点击订单时变成了升序,这就是为什么不改变的原因。因此,为避免您可以将默认位置更改为 desc。我更新了 stackblitz 现在它正在工作。如果您不想在其他列上只显示图标,请删除其标题上的 mat-sort-header 图标将不会显示
  • wtf 材料,2021 年,但仍然无法正常工作
猜你喜欢
  • 2019-04-05
  • 2022-10-26
  • 2018-03-19
  • 2021-05-11
  • 1970-01-01
  • 2022-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多