Получить индекс строки в таблице угловых материалов 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"
если таблица имеет несколько шаблонов строк
Я много искал, но для моего случая сценарий "indexOf" не работает должным образом, тогда я нашел этот ответ, и он делает именно то, что мне нужно.
let i = index;
i + (paginator.pageIndex * paginator.pageSize);