how to define index in angular material table

JavascriptAngularTypescriptAngular Material2

Javascript Problem Overview


how should I define an index variable when angular material table is used as ngFor is not used in this table.

I did search for it in the documentation but index is not mentioned any where in it.

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

    <!--- Note that these columns can be defined in any order.
          The actual rendered columns are set as a property on the row definition" -->

    <!-- 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">
      <mat-header-cell *matHeaderCellDef> Name </mat-header-cell>
      <mat-cell *matCellDef="let element"> {{element.name}} </mat-cell>
    </ng-container>

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

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

    <mat-header-row *matHeaderRowDef="displayedColumns"></mat-header-row>
    <mat-row *matRowDef="let row; columns: displayedColumns;"></mat-row>
  </mat-table>
</div>

where and how do i define an index variable for the array that I used in this table, so that I can bind the index value in my table itself.

Javascript Solutions


Solution 1 - Javascript

Can you add index to let element; let i = index;" as you'd do with *ngFor?

<mat-row *matRowDef="let row; columns: displayedColumns; let i = index"></mat-row>

Or like so:

<ng-container matColumnDef="index">
  <mat-header-cell *matHeaderCellDef> Index </mat-header-cell>
  <mat-cell *matCellDef="let element; let i = index;">{{i}}</mat-cell>
</ng-container>

Working Example: https://stackblitz.com/edit/angular-acdxje?file=app/table-basic-example.html

Solution 2 - Javascript

For anyone who has set the multiTemplateDataRows property of mat-table to true, you can't use index. Instead you have use either dataIndex or renderIndex.

<mat-cell *matCellDef="let row; let i = dataIndex;">{{i}}</mat-cell>

See https://github.com/angular/material2/issues/12793

Solution 3 - Javascript

For those who are facing problem with keeping the right index when using pagination which table has more than 1 page. It can be especially important when you have editable element, thus you're using a routerLink to add/edit/delete selected elements.

<ng-container matColumnDef="title">
 <mat-header-cell *matHeaderCellDef mat-sort-header>Title</mat-header-cell>
 <mat-cell *matCellDef="let book; let i = index;" fxLayoutAlign.lt-md="center center">
  <button mat-button [routerLink]="[i + (paginator.pageIndex * paginator.pageSize)]" routerLinkActive="active"</button>
 </mat-cell>
</ng-container>

As well as

<mat-paginator #paginator [pageSize]="5" [pageSizeOptions]="[5, 10, 25, 100]"></mat-paginator>

In essence, i + (paginator.pageIndex * paginator.pageSize) is the solution, but it counts from 0. If you'd like to index from 1, simply make it (i+1) + (paginator.pageIndex * paginator.pageSize). Worth to note is that you really need the #paginator and [pageSize]="VALUE".

Solution 4 - Javascript

If someone using <mat-paginator ../>, then index can be interpreted as below

<mat-cell *matCellDef="let element; index as i"> {{paginator.pageSize * paginator.pageIndex + i + 1}}</mat-cell>

Solution 5 - Javascript

From Angular 5 you can alias index to local variable i using index as i

<ng-container matColumnDef="rowIndex">
  <mat-header-cell *matHeaderCellDef> Index </mat-header-cell>
  <mat-cell *matCellDef="let element;index as i;"> {{ i }} </mat-cell>
</ng-container>

Solution 6 - Javascript

If you are using pagination in your mat-table,

<ng-container matColumnDef="index">
   <mat-header-cell *matHeaderCellDef> Index </mat-header-cell>
   <mat-cell *matCellDef="let element; index as i">
        {{tableOnePaginator.pageSize * tableOnePaginator.pageIndex + i + 1}}</mat-cell>
</ng-container>

In here, this tableOnePaginator is need to define in your ts component before using it. And make sure you have set that to your dataSource as follows.

this.dataSource.paginator = this.tableOnePaginator;

Solution 7 - Javascript

If you are using paginator and you want to place index with every page change then go with this below code; In .HTML file:-

<ng-container matColumnDef="Position">
   <th mat-header-cell *matHeaderCellDef> # </th>
   <td mat-cell *matCellDef="let element; let i= index"> {{i + 1 +
     (thirdPaginator.pageIndex*thirdPaginator.pageSize) }}</td>
</ng-container>

Solution 8 - Javascript

If you are use paginator try this:

<ng-container matColumnDef="position">
  <th mat-header-cell *matHeaderCellDef> Position </th>
  <td mat-cell *matCellDef="let element; let i = index"> {{(i+1) + (paginator.pageIndex*paginator.pageSize)}} </td>
</ng-container>

this working perfectly for Angular version 8.you must use #paginator and [pageSize]="VALUE"

Solution 9 - Javascript

<td mat-cell *matCellDef="let row; let indx = dataIndex">

When using the multiTemplateDataRows directive to support multiple rows for each data object, the context of *matRowDef is the same except that the index value is replaced by dataIndex and renderIndex.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
Questionpushplata patelView Question on Stackoverflow
Solution 1 - JavascriptRoberto ZvjerkovićView Answer on Stackoverflow
Solution 2 - Javascriptadam0101View Answer on Stackoverflow
Solution 3 - JavascriptDaniel DanieleckiView Answer on Stackoverflow
Solution 4 - JavascriptRamView Answer on Stackoverflow
Solution 5 - JavascriptElasticCodeView Answer on Stackoverflow
Solution 6 - JavascriptMohamed MusthaqueView Answer on Stackoverflow
Solution 7 - JavascriptRURUView Answer on Stackoverflow
Solution 8 - JavascriptHarith DilshanView Answer on Stackoverflow
Solution 9 - Javascriptsiva gopiView Answer on Stackoverflow