Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

1.1K
Views
¿Cómo usar MatTableDataSource con un observable?

Estoy usando mat-table y estoy tratando de usar MatTableDataSource con un observable (obtengo los datos de un servicio web), pero no sé cómo configurar MatTableDataSource para usar un observable en lugar de una matriz.

¿La única solución a este problema es suscribirse a lo observable en el método ngOnInit y crear siempre un nuevo MatTableDataSource cuando lleguen nuevos datos?

Esto es lo que tengo hasta ahora, pero no sé si esta es la solución correcta para trabajar con MatTableDataSource con un observable.

 dataSource: MatTableDataSource<Thing>; @ViewChild(MatPaginator, { static: true }) paginator: MatPaginator; @ViewChild(MatSort, { static: true }) sort: MatSort; ngOnInit() { getThings().subscribe(things => { this.dataSource = new MatTableDataSource(things); this.dataSource.paginator = this.paginator; this.dataSource.sort = this.sort; }); }
over 4 years ago · Santiago Trujillo
5 answers
Answer question

0

También puedes usar un observable, solo (*)

 [dataSource]="dataSource|async"

(*) realmente no necesitas usar la tubería asíncrona

Vea un ejemplo en stackblitz , donde reemplazo el primer ejemplo del documento por

 dataSource = of(ELEMENT_DATA).pipe(delay(1000));
over 4 years ago · Santiago Trujillo Report

0

He lanzado una biblioteca para eso: @matheo/datasource

Te explico los conceptos básicos en este artículo:
https://medium.com/@matheo/reactive-datasource-for-angular-1d869b0155f6

y en el código de ejemplo, puede ver cómo obtengo elementos de una base de datos de Firebase y manipulo la paginación. clasificación y filtros en el repositorio de ejemplo
Espero que os guste y me deis vuestra opinión al respecto ;)

over 4 years ago · Santiago Trujillo Report

0

Debería poder actualizar MatTableDataSource una vez en el nivel de clase y luego usar el configurador de data en ngOnInit .

 dataSource = new MatTableDataSource<Thing>(); @ViewChild(MatPaginator, { static: true }) paginator: MatPaginator; @ViewChild(MatSort, { static: true }) sort: MatSort; ngOnInit() { getThings().subscribe(things => { this.dataSource.data = things; this.dataSource.paginator = this.paginator; this.dataSource.sort = this.sort; }); }
over 4 years ago · Santiago Trujillo Report

0

esta es una solución, porque MatTableDataSource no es compatible con Observable como fuente de datos

 import { MatTableDataSource } from '@angular/material'; import { Observable, Subscription } from 'rxjs'; import { SomeInterface} from './some.interface'; export class CustomDataSource extends MatTableDataSource<SomeInterface> { private collection: SomeInterface[] = []; private collection$: Subscription; constructor(collection: Observable<SomeInterface[]>) { super(); this.collection$ = collection.subscribe(data => { this.data = data; // here you have to adjust the behavior as needed }); } disconnect() { this.collection$.unsubscribe(); super.disconnect(); } }

luego en componente:

 dataSource: CustomDataSource; ngOnInit(): void { const observableData$ = getData(); this.dataSource = new CustomDataSource(observableData$); // this.dataSource.sort = this.sort; // add sorting or filter }

ejemplo: stackblitz

over 4 years ago · Santiago Trujillo Report

0

Para usar MatTableDataSource como Observable:

Puedes pipe tu observable:

 thingsAsMatTableDataSource$: Observable<MatTableDataSource<Thing>> = getThings().pipe( map(things => { const dataSource = new MatTableDataSource<Thing>(); dataSource.data = things; return dataSource; }));

Como se mencionó anteriormente, puede usar una tubería asíncrona en su observable en la plantilla como fuente de datos:

 [dataSource]="thingsAsMatTableDataSource$ | async"

De esta manera, no tiene que suscribirse y aún puede disfrutar de la clasificación de tapetes, etc.

over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!