получить индекс строки в таблице угловых материалов v5

Я пытаюсь получить индекс строки в таблице, в 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>

Метод doSomething - это то, что нужно индексу.

Любая помощь будет принята с благодарностью.

Ответ 1

Использование 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>

https://material.angular.io/components/table/examples

Ответ 2

Вы можете использовать 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>

демонстрация

С решением @user3891850 (let я = index;) в случае разбиения на страницы индекс будет индексом на этой странице, а не в глобальном объекте, поэтому вы должны быть осторожны в случае разбиения на страницы. пример

Ответ 3

Если вы столкнулись с этой проблемой и используете paginator вы получите здесь:

  <td mat-cell *matCellDef="let element; let i = index">{{i}}</td>

будет текущий индекс, отображаемый в таблице. Например, если вы находитесь на странице 2, а размер вашей страницы равен 5, то первый индекс таблицы будет 0, а не 5 (или шестой элемент). Итак, что вы можете сделать, чтобы получить истинный индекс, примерно так:

index =
      this.paginator.pageIndex > 0
        ? index + this.paginator.pageIndex * this.paginator.pageSize
        : index;

Если страница находится на первой странице, индекс не изменяется. В противном случае умножьте pageIndex на pageSize и добавьте его в индекс.

Ответ 4

Я знаю, что этот пост старый, но вышеуказанное решение не сработало для меня. вместо этого, если let i = index; попробуйте let i = dataIndex для последней версии проверки таблицы матов это решение. Не знаю, если это только для расширяемой таблицы, хотя

Ответ 5

Я много искал, но для моего случая сценарий "indexOf" не работает должным образом, тогда я нашел этот ответ, и он делает именно то, что мне нужно.

let i = index;
i + (paginator.pageIndex * paginator.pageSize);

Ответ 6

Включить 'let i = index' в * matRowDef