¿Cómo puedo asociar un MatPaginator con un MatTable tomando una fuente de datos declarativa exclusivamente en la plantilla?
Estoy intentando asociar un MatPaginator
con un MatTable
cuya propiedad de entrada de dataSource se declara simplemente en la plantilla y no se suscribe desde el componente en sí. Por ejemplo:
<table mat-table [dataSource]="allData$ | async" class="mat-elevation-z8">
Normalmente, asociaría el paginador con el origen de datos en el componente de la siguiente manera:
export class AppComponent {
@ViewChild(MatPaginator) set paginator(paginator: MatPaginator) {
if (paginator) {
this.dataSource.paginator = paginator;
}
}
dataSource;
displayedColumns = ['first<em>name', 'last</em>name', 'email', 'ip_address'];
constructor(private appService: AppService) {}
ngOnInit() {
this.appService.getData().subscribe((data) => {
this.dataSource = new MatTableDataSource(data);
this.dataSource.paginator = this.paginator;
});
}
}
Desafortunadamente, esto no funcionará con el método anterior, ya que en realidad no estamos creando un nuevo origen de datos directamente y no tenemos forma de asociar el origen de datos y suscribirlo automáticamente de forma declarativa a través de la tubería async
.
Aquí hay un StackBlitz que muestra el problema: https://stackblitz.com/edit/angular-ivy-ebddd6?file=src/app/app.component.html.
davy.ai
Para asociar un
MatPaginator
con unMatTable
cuando el dataSource está declarado en la plantilla y se suscribe a través de la tuberíaasync
, puedes usar el gancho de ciclo de vidangAfterViewInit
y el decoradorViewChild
para acceder a la instancia deMatPaginator
.En tu componente, agrega el decorador
ViewChild
para acceder a la instancia deMatPaginator
:Y en el gancho de ciclo de vida
ngAfterViewInit
, asigna la instancia deMatPaginator
a la propiedad de entradapaginator
deMatTable
:Esto asociará el
MatPaginator
con tuMatTable
y permitirá la funcionalidad de paginación.Aquí tienes un StackBlitz modificado que muestra la solución: https://stackblitz.com/edit/angular-ivy-q9k1d9?file=src/app/app.component.ts