Tengo una tabla de datos de material angular 2 normal con encabezados de clasificación. Todo tipo de encabezados funcionan bien. Excepto el que tiene un objeto como valor. Estos no se clasifican en absoluto.
Por ejemplo:
<!-- Project Column - This should sort!-->
<ng-container matColumnDef="project.name">
<mat-header-cell *matHeaderCellDef mat-sort-header> Project Name </mat-header-cell>
<mat-cell *matCellDef="let element"> {{element.project.name}} </mat-cell>
</ng-container>
nota la element.project.name
Aquí está la configuración de displayColumn:
displayedColumns = ['project.name', 'position', 'name', 'test', 'symbol'];
Cambiar 'project.name'
a 'project'
no funciona ni"project['name']"
¿Qué me estoy perdiendo? ¿Es esto siquiera posible?
Aquí hay un Stackblitz: objetos de ordenación Angular Material2 DataTable
Editar: Gracias por todas tus respuestas. Ya lo tengo funcionando con datos dinámicos. Por lo tanto, no tengo que agregar una declaración de cambio para cada nueva propiedad anidada.
Aquí está mi solución: (No es necesario crear un nuevo DataSource que amplíe MatTableDataSource)
export class NestedObjectsDataSource extends MatTableDataSource<MyObjectType> {
sortingDataAccessor: ((data: WorkingHours, sortHeaderId: string) => string | number) =
(data: WorkingHours, sortHeaderId: string): string | number => {
let value = null;
if (sortHeaderId.indexOf('.') !== -1) {
const ids = sortHeaderId.split('.');
value = data[ids[0]][ids[1]];
} else {
value = data[sortHeaderId];
}
return _isNumberValue(value) ? Number(value) : value;
}
constructor() {
super();
}
}
fuente
Respuestas:
Fue difícil encontrar documentación sobre esto, pero es posible usando
sortingDataAccessor
y una declaración de cambio. Por ejemplo:fuente
sort
a partir dethis.dataSource.sort = sort;
ngAfterViewInit
para que funcionaraPuede escribir una función en el componente para obtener una propiedad profunda del objeto. Entonces úsalo
dataSource.sortingDataAccessor
como a continuaciónY en html
fuente
lodash
en mi proyecto, así que si usalodash
, esta solución se traduce en esto:this.dataSource.sortingDataAccessor = _.get;
No es necesario reinventar el acceso profundo a la propiedad.La respuesta dada se puede incluso acortar, sin necesidad de cambiar, siempre que utilice la notación de puntos para los campos.
fuente
Me gustan las soluciones de @Hieu_Nguyen. Solo agregaré que si usa lodash en su proyecto como lo hago yo, la solución se traduce a esto:
No es necesario reinventar el acceso profundo a la propiedad.
fuente
displayedColumns
's como la ruta a los valores, es decir,['title', 'value', 'user.name'];
y luego usar<ng-container matColumnDef="user.name">
en su plantilla.Utilizo un método genérico que te permite usar un dot.seperated.path con
mat-sort-header
omatColumnDef
. Esto falla al regresar silenciosamente sin definir si no puede encontrar la propiedad dictada por la ruta.Solo necesita configurar el acceso a datos
fuente
Personalicé para múltiples niveles de objetos anidados.
fuente
Cannot find name '_isNumbervalue
, y asumiendo que este es un método lodash, no puedo encontrar el método en el módulo de nodo.isNumber
existe. No estoy familiarizado previamente con lodash si eso es lo que es. ¿Cómo utilizo esto?Otra alternativa, que nadie echó aquí, aplanar la columna primero ...
¡Solo otra alternativa, pros y contras para cada uno!
fuente
Simplemente agregue esto a su fuente de datos y podrá acceder al objeto anidado
fuente
Está intentando ordenar por elemento ['project.name']. Obviamente, el elemento no tiene tal propiedad.
Debería ser fácil crear una fuente de datos personalizada que amplíe MatTableDatasource y admita la clasificación por propiedades de objetos anidados. Consulte los ejemplos en los documentos material.angular.io sobre el uso de una fuente personalizada.
fuente
Tuve el mismo problema, al probar la primera proposición tuve algunos errores, pude solucionarlo agregando "switch (propiedad)"
fuente
Utilice MatTableDataSource Compruebe la solución completa del problema MatSort
en HTML
fuente