I'm using Angular 9.0.4 with @angular/material 9.1.3 and I want to show a basic material table:
<table mat-table [dataSource]="devizas" class="mat-elevation-z8">
<!-- name -->
<ng-container matColumnDef="name">
<th mat-header-cell *matHeaderCellDef>Name</th>
<td mat-cell *matCellDef="let element"> {{ element.name }} </td>
</ng-container>
<!-- code -->
<ng-container matColumnDef="code">
<th mat-header-cell *matHeaderCellDef>Code</th>
<td mat-cell *matCellDef="let element"> {{ element.code }} </td>
</ng-container>
</table>
I imported in my app.module.ts this:
import { MatTableModule } from '@angular/material/table';
@NgModule({
imports: [
MatTableModule,
],
})
In my component.ts:
export class DevizaListComponent implements OnInit {
devizas: DevizaInterface[] = [
{
name: 'dollar',
code: 'USD' ,
}
];
constructor() { }
ngOnInit() { }
}
Now I get this error message in the browser:
Error: Missing definitions for header, footer, and row; cannot determine which columns should be rendered. at getTableMissingRowDefsError (table.js:996) at MatTable.push../node_modules/@angular/cdk/ivy_ngcc/fesm5/table.js.CdkTable.ngAfterContentChecked (table.js:1296)
The official documentation says nothing relevant. Any idea?
The CdkTable is an unopinionated, customizable data-table with a fully-templated API, dynamic columns, and an accessible DOM structure. This component acts as the core upon which anyone can build their own tailored data-table experience.
In fact, it is possible to create a material table without a datasource. You need to make sure you made the header definitions with displayed columns and all.
A DataSource is simply a class that has at a minimum the following methods: connect and disconnect . The connect method will be called by the table to provide an Observable that emits the data array that should be rendered.
The DataSource is meant to serve a place to encapsulate any sorting, filtering, pagination, and data retrieval logic specific to the application. So, a datasource therefore contains all logic required for sorting, filtering and paginating data.
Try this!
<table mat-table [dataSource]="devizas" class="mat-elevation-z8">
....
<tr mat-header-row *matHeaderRowDef="displayedColumns"></tr>
<tr mat-row *matRowDef="let row; columns: displayedColumns;"></tr>
</table>
You are missing below line in html
code :
<tr mat-header-row *matHeaderRowDef="columndefs"></tr>
<tr mat-row *matRowDef="let row; columns: columndefs;"></tr>
create an array with column definitions as below in component.ts file :
columndefs : any[] = ['name','code'];
Update table code as below :
<table mat-table [dataSource]="devizas" class="mat-elevation-z8">
<ng-container matColumnDef="name">
<th mat-header-cell *matHeaderCellDef>Name</th>
<td mat-cell *matCellDef="let element"> {{ element.name }} </td>
</ng-container>
<ng-container matColumnDef="code">
<th mat-header-cell *matHeaderCellDef>Code</th>
<td mat-cell *matCellDef="let element"> {{ element.code }} </td>
</ng-container>
<tr mat-header-row *matHeaderRowDef="columndefs"></tr>
<tr mat-row *matRowDef="let row; columns: columndefs;"></tr>
</table>
Here is the demo : demo
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With