how to define index in angular material table

95,461

Solution 1

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

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

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

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

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>
Share:
95,461

Related videos on Youtube

pushplata patel
Author by

pushplata patel

Updated on July 08, 2022

Comments

  • pushplata patel
    pushplata patel almost 2 years

    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.

    • Igor Dimchevski
      Igor Dimchevski about 6 years
      Can you handle the index value and set it when you fetch the data from the API?
    • pushplata patel
      pushplata patel about 6 years
      I'm sorry, I didn't get you. Can you be more clear?
  • pushplata patel
    pushplata patel about 6 years
    Thank you. Will try it and let you know if it's working :)
  • Roberto Zvjerković
    Roberto Zvjerković about 6 years
    No problem. Here is a working StackBlitz example. stackblitz.com/edit/angular-acdxje?file=app/…
  • Muhammad Ali
    Muhammad Ali almost 5 years
    Thanks a lot. This is exactly what I was looking for :)
  • Nestor Perez
    Nestor Perez over 4 years
    Thank you, you save my day :D
  • Ramiro G.M.
    Ramiro G.M. over 4 years
    Works! But I'd love to know where this came from....how did you know there's a variable index available to be consumed? Can someone explain this further please?
  • Aamer Shahzad
    Aamer Shahzad over 4 years
    <td td mat-cell *matCellDef="let index = index">{{ (index + 1) + (paginator.pageIndex * paginator.pageSize) }}</td> works best for paginated data table. thanks.
  • Limey
    Limey about 4 years
    you deserve all the up votes! i spent over an hour trying to figure out why my index didn't work till I came across your golden nugget! Thanks so much!
  • Eslam Sameh Ahmed
    Eslam Sameh Ahmed about 4 years
    Take care that it will repeat per page if you enabled pagination
  • Eslam Sameh Ahmed
    Eslam Sameh Ahmed about 4 years
    Take care that it will repeat per page if you enabled pagination
  • Saurabh Tiwari
    Saurabh Tiwari over 3 years
    Worth to note is that you really need the #paginator and [pageSize]="VALUE". This is the real key.
  • Kasun
    Kasun over 3 years
    if you have pagination you can calculate row index like {{this.paginator.pageIndex * this.paginator.pageSize + i}}
  • Santosh
    Santosh over 3 years
    let i=dataIndex this is working for me.
  • Mohamed Musthaque
    Mohamed Musthaque about 3 years
    As mentioned in a comment above, please remove "this" keyword and try as {{paginator.pageIndex * paginator.pageSize + i}} and will work.!
  • Sandeep Kumar
    Sandeep Kumar over 2 years
    Thanks a lot, it's working. {{ i + (paginator.pageIndex * paginator.pageSize) + 1}}
  • Mohamed Fahmy
    Mohamed Fahmy over 2 years
    this answer is a treasure