javascript 为什么排序不工作的材料表 Package 在 accordion ?

of1yzvn4  于 2023-01-04  发布在  Java
关注(0)|答案(1)|浏览(125)

根据要求,我有两个可折叠面板,每个面板都有一个独立的表。单击第一个可折叠面板,它会打开并调用API,从后端获取数据,并呈现在第一个可折叠面板中的表上。使用此表,排序工作正常,但当我打开第二个可折叠面板时,排序不工作。

HTML代码:

<mat-accordion multi="false" [togglePosition]="'before'">
    <ng-container *ngFor="let item of usersData; let i=index;last as last">
    <mat-expansion-panel class="mt-2" #isExpanded>
        <mat-expansion-panel-header (click)="showData(item.id, isExpanded.expanded)">
            <table>
                <tr>
                    <th class="col-4 px-2">Number</th>
                    <th class="col-4">Name</th>
                    <th class="col-4">Date</th>
                    <td> <button mat-icon-button matTooltip="Delete">
                            <mat-icon class="mat-icon mat-primary">delete</mat-icon>
                        </button>
                    </td>
                </tr>
                <tr>
                    <td class="col-4 px-2"><span matTooltip="{{item.number}}">{{item.number}}</span></td>
                    <td class="col-4"><span matTooltip="{{item.name}}">{{item.name}}</span></td>
                    <td class="col-4"><span matTooltip="{{item.createdAt | date: 'yyyy-MM-dd'}}">{{item.createdAt | date: 'yyyy-MM-dd'}}</span></td>
                    <td></td>
                </tr>
            </table>
        </mat-expansion-panel-header>
        <div class="m-2" fxLayout="row wrap" fxLayoutGap="20px">
            <div class="bh-table-title bh-table mt-2 scroll">
                <table mat-table *ngIf="dataSource.data.length > 0" [dataSource]="dataSource" matSort #MatSorteds matSortStart="desc">
                    <ng-container matColumnDef="number">
                        <th mat-header-cell *matHeaderCellDef mat-sort-header>Number</th>
                        <td mat-cell *matCellDef="let element" matTooltip="{{element.number}}">
                            <button class="link" (click)="navigate(element)">{{element.number}}</button>
                        </td>
                    </ng-container>
                    <ng-container matColumnDef="Name">
                        <th mat-header-cell *matHeaderCellDef mat-sort-header> Name</th>
                        <td mat-cell *matCellDef="let element" matTooltip="{{element.Name}}">
                            {{element.name}}</td>
                    </ng-container>
                    <ng-container matColumnDef="createdAt">
                        <th mat-header-cell *matHeaderCellDef mat-sort-header>Date</th>
                        <td mat-cell *matCellDef="let element" matTooltip="{{element.createdAt| date: 'yyyy-MM-dd'}}">
                            {{element.createdAt | date: 'yyyy-MM-dd'}}</td>
                    </ng-container>
                    <tr mat-header-row *matHeaderRowDef="columnsToDisplay;sticky: true" mat-sort></tr>
                    <tr mat-row *matRowDef="let row; columns: columnsToDisplay;"></tr>
                </table>
            </div>
        </div>
        <div class="no-records-panel" *ngIf="dataSource.data.length === 0">No Records found</div>
    </mat-expansion-panel>
    </ng-container>
</mat-accordion>

组件代码:

@ViewChild(MatSort) matSort!: MatSort;

 ngAfterViewInit(): void {
    this.dataSource.data = this.data;
    this.dataSource.paginator = this.paginator;
     this.dataSource.sort = this.matSort;
  }
lb3vh1jj

lb3vh1jj1#

你有一个独特的 accordion 打开的时间,所以唯一的是"给时间"的Angular 显示数据表之前,asig的垫排序。
而不是使用ngAfterViewInit,它是当您获得数据时,您需要指定
我假设你有一个函数showData

showData(id:number, isExpanded:bool)
{
    this.myservice.getData(id).subscribe(res=>{
       this.dataSources=new MatDataTable(res)
       //enclosed in a setTimeout()
       setTimeout(()=>{
          this.dataSource.sort=this.matSort
       })
    })
}

这是因为ViewChild获得了找到的"第一个" MatSort。

    • 另一种查看方法**是使用ViewChildren而不是ViewChild
@ViewChildren(MatSort) matSorts: QueryList<MatSort>;

然后,始终都是"visibles"(不在 * ngIf下),可以确保第一个位置的Querylist元素是第一个表的第一个数学排序。
因此,首先我们需要"删除" *ngIf

<table mat-table *ngIf="dataSource.data.length > 0"... matSort>
  ..
</table>

并定义一个dataSource数组

dataSource:MatDataSource[]=[]

所以,就像

<table mat-table *ngIf="dataSource[i].data.length > 0"... matSort>
  ..
</table>
<div [style.visibility]="dataSource[i].data.length <= 0:'collapse':null">
  <table mat-table ... matSort>
    ..
  </table>
</div>

现在,当给dataSource.sort赋值时
我们能做的

this.usersData.forEach((_,index:number)=>{
    this.dataSource[index]new MatDataSource() //a matDataSource empty
    this.dataSource[index].sort=this.matSorts.find((x:any,index:number)=>index==i)
})

然后为MathDataSource赋值

showData(id:number, isExpanded:bool)
{
    const index=this.usersData.findIndex(x=>x.id==id);

    this.myservice.getData(id).subscribe(res=>{
       this.dataSources[index].data=res
    })
}

相关问题