Dynamic-Columns-Mat-Table
Here we have solution for dynamic Mat table columns
Step 1: Create column Definition Model class
export class ColumnDefinition {Step 2: Add Mat-Table Defintion as below in Html Template
columnDef: string;
header: string;
cell: any;
constructor(_columnDef: string, _header: string, _cell: any) {
this.columnDef = _columnDef; this.header = _header; this.cell = _cell;
}
}
<table mat-table [dataSource]="mattabledataSource" matSort class="mat-elevation-z8">
<ng-container *ngFor="let col of displaycolumndefs" matColumnDef="{{col.columnDef}}" >
<div >
<th mat-header-cell *matHeaderCellDef mat-sort-header > {{col.header}} </th>
<td mat-cell *matCellDef="let element">{{ col.cell(element) }}</td>
</div>
</ng-container>
<tr mat-header-row *matHeaderRowDef="displayedColumns; sticky: true"></tr>
<tr mat-row *matRowDef="let row; columns: displayedColumns;"></tr>
</table>
Step 3 : Declare Array of ColumnDefinition that defines your dynamic columns as below
export const peoplecolumns: ColumnDefinition[] = [
{ columnDef: 'Sno', header: 'Sno.', cell: (element: people) => `${element.Sno}`},
{ columnDef: 'name', header: 'Name.', cell: (element: people) => `${element.name}` },
{ columnDef: 'canspeak', header: 'Can speak?', cell: (element: people) => `${element.canspeak}`},
{ columnDef: 'canwrite', header: 'Can write?', cell: (element: people) => `${element.canwrite}`}
];
Step 4 : Create Data source Model here we created people model as below
export interface people {
name: string;
Sno: number;
canspeak: boolean;
canwrite: boolean;
}
Step 5 : Create Data source array , in this example we created people array as below
export const PEOPLE_DATA: people[] = [
{Sno: 1, name: 'John', canspeak: false, canwrite: false},
{Sno: 2, name: 'Miller', canspeak: false, canwrite: false},
{Sno: 3, name: 'Peter', canspeak: false, canwrite: false},
{Sno: 4, name: 'Smith', canspeak: false, canwrite: false},
{Sno: 5, name: 'Warner', canspeak: false, canwrite:false},
{Sno: 6, name: 'Shane', canspeak: false, canwrite:false},
{Sno: 7, name: 'Mr.G', canspeak: false, canwrite: false},
{Sno: 8, name: 'Ryan', canspeak: false, canwrite: false},
{Sno: 9, name: 'Rocky', canspeak: false, canwrite: false},
{Sno: 10, name: 'Sham', canspeak: false, canwrite: false},
];
Step 6: In Component.ts file declare below variables
displayedColumns: Array<string> = peoplecolumns.map(c => c.columnDef);
public mattabledataSource: MatTableDataSource<any>;
public displaycolumndefs: ColumnDefinition[];
public peopledata;
// For Sorting
@ViewChild(MatSort) sort: MatSort;
Step 7: In Component.ts constructor call add below
constructor () {
// peoplecolumns assigned to displayed column definition
this.displaycolumndefs =peoplecolumns;
this.peopledata = PEOPLE_DATA;
// Mat Data Source constructor call
this.mattabledataSource = new MatTableDataSource<any>();
// people data assigned to mat data source
this.mattabledataSource.data =this.peopledata;
}
Step 8: In Component.ts ngOnInit()-For Sorting
ngOnInit() {this.mattabledataSource.sort = this.sort;}
Step 9 : Run your project and see the result as below
Code Action @ StackBlitz
3 Comments
Sorting is not working for dynamic columns
ReplyDeleteThe Source Has been fixed...
DeleteThhanks for a great read
ReplyDelete