MatSort e MatPaginator não funcionam sem setTimeOut
Eu tenho dados provenientes de um ponto de extremidade e os colocamos em MatTableDataSource. Consegui fazê-lo funcionar para MatSort e MatPaginator, mas precisava usar setTimeOut, o que não parece ser uma maneira adequada de fazer isso. Se eu remover isso, ele reclamará que 'Não é possível ler a propriedade de classificação indefinida', assumi que isso se deve ao fato de ainda não ter sido inicializado.
Eu também tentei:
para movê-lo para o afterviewinit, mas os dados foram carregados após o afterviewinit ser chamado para que ainda não funcioneusing this.changeDetectorRef.detectChanges () após this.datasource = new ... também não funcionaEste é o meu código atual (que está funcionando, mas usando settimeout)
<div *ngIf="!isLoading">
<div *ngFor="let record of renderedData | async" matSort>
// ... some html to show the 'record'
<mat-paginator #paginator
[pageSizeOptions]="[5, 10, 20]">
</mat-paginator>
</div>
O component
export class ResultsComponent implements OnInit, OnDestroy, AfterViewInit {
dataSource: MatTableDataSource<any> = new MatTableDataSource();
renderedData: Observable<any>;
@ViewChild(MatPaginator) paginator: MatPaginator;
@ViewChild(MatSort) sort: MatSort;
constructor(some service) {}
ngOnInit() {
const accountId = someOtherService.getAccountId();
this.someService.getData(accountId)
.subscribe((myData) => {
this.dataSource = new MatTableDataSource(myData);
// it won't work properly if it is not wrapped in timeout
setTimeout(() => {
this.dataSource.paginator = this.paginator;
this.sort.sort(<MatSortable>({id: 'created_on', start: 'desc'}));
this.dataSource.sort = this.sort;
});
this.renderedData = this.dataSource.connect();
}
});
}
ngAfterViewInit() {
}
ngOnDestroy(): void {
if (this.dataSource) { this.dataSource.disconnect(); }
}
}
O código acima está funcionando para mim, estou apenas procurando o caminho certo para não usar settimeout, se possíve