Saltar al contenido

Cómo crear una tabla de tapete anidada en una tabla con filas expandibles usando material angular

Francisco, miembro de este equipo de trabajo, nos hizo el favor de escribir este artículo porque controla muy bien el tema.

Solución:

Nota: Para aquellos que quieran saltarse la larga explicación, aquí está el ejemplo de StackBlitz.

Lo que realmente quieres es crear un anidado mat-table donde todas las tablas anidadas se pueden ordenar y también se pueden filtrar.

En primer lugar, dado que necesita filtrar y clasificar en su tabla anidada, debe crear una nueva MatTableDataSource para ello. Esto se puede hacer inicialmente cuando se crea el principal dataSource en el ngOnInit como abajo.

usersData: User[] = [];

USERS.forEach(user => 
    if (user.addresses && Array.isArray(user.addresses) && user.addresses.length) 
        this.usersData = [...this.usersData,  ...user, addresses: new MatTableDataSource(user.addresses) ];
     else 
        this.usersData = [...this.usersData, user];
    
);
this.dataSource = new MatTableDataSource(this.usersData);

Del ejemplo de filas expandibles en los documentos, podemos ver cómo crear una fila expandible. En la fila expandible, ahora tendremos una tabla junto con el Filter aporte. Agregaremos algunas condiciones para que la fila sea expandible solo si hay addresses presente.

innerColumn element[innerColumn]

Ahora que la fila se expande solo si hay elementos anidados, debemos deshacernos del desplazamiento para los usuarios que no tienen addresses

Aquí está el CSS responsable de agregar un background-color en vuelo estacionario

tr.example-element-row:not(.example-expanded-row):hover 
    background: #777;

Así que solo tenemos que agregar el example-element-row clase a nuestra fila si la fila tiene un address. Si no tiene una dirección, no se debe hacer clic en la fila y no debe haber un cursor que le indique al usuario que, de hecho, no se puede hacer clic en la fila.



En toggleRow, definiremos la lógica de lo que sucede cuando hace clic en una fila de la plantilla. También implementaremos sort cuando el usuario hace clic en la fila en esta función.

@ViewChildren('innerSort') innerSort: QueryList;

toggleRow(element: User) 
    element.addresses && (element.addresses as MatTableDataSource
).data.length ? (this.expandedElement = this.expandedElement === element ? null : element) : null; this.cd.detectChanges(); this.innerTables.forEach((table, index) => (table.dataSource as MatTableDataSource
).sort = this.innerSort.toArray()[index]);

Finalmente, necesitamos definir el applyFilter para que las tablas anidadas se puedan filtrar.

@ViewChildren('innerTables') innerTables: QueryList>;

applyFilter(filterValue: string) 
    this.innerTables.forEach((table, index) => (table.dataSource as MatTableDataSource
).filter = filterValue.trim().toLowerCase());

Aquí hay un ejemplo de trabajo en StackBlitz.

Si guardas algún incógnita o disposición de aclarar nuestro sección eres capaz de escribir una anotación y con gusto lo estudiaremos.

¡Haz clic para puntuar esta entrada!
(Votos: 2 Promedio: 3.5)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *