Я пытаюсь использовать таблицу угловых материалов с расширяемыми строками с paginator, проблема в том, что с настраиваемым соединением MatTableDataSource, используемым для расширяемой строки, пагинация перестает работать, я не нашел нигде ответов на проблему.
Итак, данные тестовой таблицы предоставляются этой заглушкой:
import { Injectable } from '@angular/core';
import { TableRow } from './table-row';
import { Observable, of } from 'rxjs';
@Injectable({
providedIn: 'root'
})
export class TestTableService {
private testData : TableRow[] = [
{id:1, name:'pi', value:3.14},
{id:2, name:'euler', value:2.71},
{id:3, name:'Feigenbaum constant', value:2.50290},
{id:4, name:'Mills constant', value:1.30637},
{id:5, name:'one', value:1},
{id:6, name:'square root of 2', value:1.41421}
];
constructor() { }
public getData() : Observable<TableRow[]>
{
return of(this.testData);
}
}
компонент таблицы:
import { Component, OnInit, ViewChild } from '@angular/core';
import { TestTableService } from './../test-table.service';
import { TableRow } from './../table-row';
import {MatPaginator, MatTableDataSource} from '@angular/material';
import { Observable, of} from 'rxjs';
import { animate, state, style, transition, trigger } from '@angular/animations';
@Component({
selector: 'app-test-table',
templateUrl: './test-table.component.html',
styleUrls: ['./test-table.component.css'],
animations: [
trigger('detailExpand', [
state('collapsed', style({ height: '0px', minHeight: '0', visibility: 'hidden' })),
state('expanded', style({ height: '*', visibility: 'visible' }))
]),
],
})
export class TestTableComponent implements OnInit {
tableData : myDataSource<TableRow> = new myDataSource();
columnsToDisplay = ['id', 'name','value'];
isExpansionDetailRow = (i: number, row: Object) => row.hasOwnProperty('detailRow');
expandedElement = null;
constructor(private testTable : TestTableService) { }
@ViewChild(MatPaginator) set matPaginator(mp: MatPaginator) {
this.paginator = mp;
this.tableData.paginator = this.paginator;
}
//@ViewChild(MatPaginator) paginator: MatPaginator;
ngOnInit() {
this.testTable.getData()
.subscribe(table => this.tableData.data = table);
//this.tableData.paginator = this.paginator;
}
expand(row){
this.expandedElement = this.expandedElement == row ? null : row;
}
//setTimeout(() => this.tableData.paginator = this.paginator);
}
Обратите внимание, что я уже пробовал много решенийпри назначении нумератора страниц .
html компонента:
<table mat-table [dataSource]="tableData">
<ng-container matColumnDef="id">
<th mat-header-cell *matHeaderCellDef> Id </th>
<td mat-cell *matCellDef="let row"> {{row.id}} </td>
</ng-container>
<ng-container matColumnDef="name">
<th mat-header-cell *matHeaderCellDef> Name </th>
<td mat-cell *matCellDef="let row"> {{row.name}} </td>
</ng-container>
<ng-container matColumnDef="value">
<th mat-header-cell *matHeaderCellDef> Value </th>
<td mat-cell *matCellDef="let row"> {{row.value}} </td>
</ng-container>
<ng-container matColumnDef="details">
<td mat-cell *matCellDef="let detail">
<!--
<app-test-table-detail [show]="detail.element == expandedElement" ></app-test-table-detail>
-->
</td>
</ng-container>
<tr mat-header-row *matHeaderRowDef="columnsToDisplay"></tr>
<tr mat-row *matRowDef="let row; columns: columnsToDisplay"
matRipple
(click)="expand(row)"></tr>
<tr mat-row *matRowDef="let row; columns: ['details']; when:isExpansionDetailRow"
[@detailExpand]="row.element==expandedElement ? 'expanded' : 'collapsed'"
style="overflow: hidden"></tr>
</table>
<mat-paginator [pageSizeOptions]="[3, 10, 20]" showFirstLastButtons></mat-paginator>
Интересно, что нумератор страниц дает правильные числа, но не имеет никакого эффекта, если яиметь дело с этим в потоке?в функции подключения?
[править] последний код на stackblitz
https://stackblitz.com/edit/angulartableexample?file=src%2Fapp%2Ftest-table%2Ftest-table.component.html
Я также попробовал то, что рекомендует парень, который удалил комментарий, - это использовать AfterViewInitтакже не работает
[Edit] путем отладки случая, в котором нет этой проблемы (без расширяемых строк), разница в этом фрагменте кода, где расширяемые строки используют мою собственную версию DataSourceнет наблюдателей, но с использованием натива есть, я что-то упустил в определении моего источника данных?