Получить индекс строки в таблице угловых материалов 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 - это то, что нужно индексировать.

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

10 ответов

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

Любой, кто использует 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>

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

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

Если вы столкнулись с этой проблемой, и вы используете 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 и добавьте его в индекс.

Я знаю, что этот пост старый, но вышеуказанное решение не сработало для меня. вместо этого, если let i = index; пытаться let i = dataIndex для последней версии 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>

Я нашел 2 случая при использовании Angular Material Table

  • С использованием *matCellDef="let row = index"если таблица имеет однострочный шаблон
  • С использованием *matCellDef="let row = dataIndex"если таблица имеет несколько шаблонов строк

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

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

let i = index;
i + (paginator.pageIndex * paginator.pageSize);
Другие вопросы по тегам