角垫表:-自定义排序中缺少排序图标

时间:2019-06-20 06:34:11

标签: angular mat-table

当我们通过代码对垫子表进行排序时,垫子排序图标未显示。如何在单击按钮而不是单击材料标题时进行排序。

StackBlitzzzz Link

1 个答案:

答案 0 :(得分: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;
 }

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

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

解决方案2:

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

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

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

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

在您的方法sortTest(val)中,我开始变得更加笨拙,因此我切换了在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;

被计为一次点击,但不显示图标,因此我们将按先前的顺序返回asc desc,以避免在两次点击都是奇怪的情况下调用它。

在所有这些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); 

即使在网上,文档和斜角材料的源代码中进行搜索,我也没有找到更好的解决方案。我发现一个类似的问题,没有一个答案。

此解决方案的堆叠闪电战:https://stackblitz.com/edit/mattable-with-custom-sort-emqkbs