获得角材料表v5中的行索引

Shi*_*ora 13 angular angular-material-5

我试图在html中获取表格中的行索引,这是使用角度材料v5.2实现的.有没有方法可以获得索引?

参考代码:

<div class="example-container mat-elevation-z8">
  <div class="example-header">
    <mat-form-field>
      <input matInput (keyup)="applyFilter($event.target.value)" placeholder="Filter">
    </mat-form-field>
  </div>

  <mat-table #table [dataSource]="dataSource">

    <!-- Position Column -->
    <ng-container matColumnDef="position">
      <mat-header-cell *matHeaderCellDef> No. </mat-header-cell>
      <mat-cell *matCellDef="let element"> {{element.position}} </mat-cell>
    </ng-container>

    <!-- Name Column -->
    <ng-container matColumnDef="name">
     <button (click)="doSomething()"> Do something</button>
    </ng-container>

    <mat-header-row *matHeaderRowDef="displayedColumns"></mat-header-row>
    <mat-row *matRowDef="let row; columns: displayedColumns;"></mat-row>
  </mat-table>
</div>
Run Code Online (Sandbox Code Playgroud)

方法doSomething是需要索引的.

任何帮助将不胜感激.

zgl*_*uis 33

使用indexOf是一种巨大的资源浪费.正确的方法是使用索引的值初始化变量,如下所示:

<ng-container matColumnDef="position">
  <th mat-header-cell *matHeaderCellDef mat-sort-header> Num. </th>
  <td mat-cell *matCellDef="let element; let i = index">{{i}}</td>
</ng-container>
Run Code Online (Sandbox Code Playgroud)

  • 这是正确的做法。如果您在此列中没有使用数据源中的任何内容(例如“element”),则无需声明它。你可以做 `&lt;td mat-cell *matCellDef="let i = index"&gt;{{i}}&lt;/td&gt;` (2认同)

She*_*nga 13

任何使用 Angular6+ 的人都应该使用let i = dataIndex而不是let i = index在这个Github 问题中解释。

这是 HTML 片段

<ng-container matColumnDef="position">
  <th mat-header-cell *matHeaderCellDef mat-sort-header> Num. </th>
  <td mat-cell *matCellDef="let element; let i = dataIndex">{{i + 1}}</td>
</ng-container>
Run Code Online (Sandbox Code Playgroud)

  • `dataIndex` - 这是正确的答案!谢谢你!这么多答案,但只有这个是有效的。 (3认同)
  • 这绝对应该是问题的答案。 (2认同)

bug*_*ugs 10

您可以使用的filteredData属性dataSource,如下所示:

<ng-container matColumnDef="weight">
  <th mat-header-cell *matHeaderCellDef> Header</th>
  <td mat-cell *matCellDef="let element"> {{dataSource.filteredData.indexOf(element)}} </td>
</ng-container>
Run Code Online (Sandbox Code Playgroud)

演示版

使用@ user3891850解决方案(let i = index;)时,如果是分页,则索引将是此页面中的索引,而不是全局对象中的索引,因此在分页时必须小心。

  • 这有效`{{dataSource.filteredData.indexOf(element)}}` (2认同)
  • 太好了,我使用 {{dataSource.filteredData.indexOf(element)+1}} 来避免值 0。谢谢! (2认同)

小智 9

如果您遇到这个问题并且您使用的paginator是您在此处获得的索引:

  <td mat-cell *matCellDef="let element; let i = index">{{i}}</td>
Run Code Online (Sandbox Code Playgroud)

将是表上显示的当前索引。例如,如果您在第 2 页并且您的页面大小为 5,那么表格的第一个索引将为 0 而不是 5(或第 6 个项目)。所以你可以做些什么来获得真正的索引是这样的:

index =
      this.paginator.pageIndex > 0
        ? index + this.paginator.pageIndex * this.paginator.pageSize
        : index;
Run Code Online (Sandbox Code Playgroud)

如果分页器在第一页,索引不会改变。否则将 pageIndex 乘以 pageSize 并将其添加到索引中。


coz*_*k05 7

我知道这篇文章很旧,但上述解决方案对我不起作用。相反,如果let i = index;尝试let i = dataIndex使用最新版本的 mat-table,请检查 此解决方案。不知道它是否仅适用于可扩展的桌子


小智 7

增加 mat-table 中的位置数....

<ng-container matColumnDef="index">
  <th mat-header-cell *matHeaderCellDef> Sr.No </th>
  <td mat-cell *matCellDef="let i=index"> {{i+1}} </td>
</ng-container>
Run Code Online (Sandbox Code Playgroud)


小智 6

我在使用Angular Material Table时发现了2种情况

  • *matCellDef="let row = index"如果表具有单行模板,则使用
  • *matCellDef="let row = dataIndex"如果表有多个行模板则使用