I am trying to implement a simple table in angular 2 using angular material selection table .
I used a button to remove the selected rows from the table.But on click of the button how can i delete the rows ?
<div class="example-container mat-elevation-z8">
<mat-table #table [dataSource]="dataSource">
<!-- Checkbox Column -->
<ng-container matColumnDef="select">
<mat-header-cell style="max-width: 100px;" *matHeaderCellDef>
<mat-checkbox (change)="$event ? masterToggle() : null"
[checked]="selection.hasValue() && isAllSelected()"
[indeterminate]="selection.hasValue() && !isAllSelected()">
</mat-checkbox>
</mat-header-cell>
<mat-cell style="max-width: 100px;" *matCellDef="let row">
<mat-checkbox (click)="$event.stopPropagation()"
(change)="$event ? selection.toggle(row) : null"
[checked]="selection.isSelected(row)">
</mat-checkbox>
</mat-cell>
</ng-container>
<!-- Number Column -->
<ng-container matColumnDef="num">
<mat-header-cell style="max-width: 100px;" *matHeaderCellDef> No. </mat-header-cell>
<mat-cell style="max-width: 100px;" *matCellDef="let element"> {{element.num}} </mat-cell>
</ng-container>
<!-- Message Column -->
<ng-container matColumnDef="name">
<mat-header-cell *matHeaderCellDef> Message </mat-header-cell>
<mat-cell *matCellDef="let element"> {{element.name}} </mat-cell>
</ng-container>
<mat-header-row *matHeaderRowDef="displayedColumns"></mat-header-row>
<mat-row *matRowDef="let row; columns: displayedColumns;"
(click)="selection.toggle(row)">
</mat-row>
</mat-table>
<mat-paginator #paginator
[pageSize]="10"
[pageSizeOptions]="[5, 10, 20]">
</mat-paginator>
</div>
<br/>
<button style="background: #3B4990; color:white;" (click)="deleted($event)">Remove Selected Messages</button>
import {Component, ViewChild} from '@angular/core';
import {MatPaginator, MatTableDataSource} from '@angular/material';
import {SelectionModel} from '@angular/cdk/collections';
@Component({
selector: 'app-home',
templateUrl: './home.component.html',
styleUrls: ['./home.component.scss']
})
export class HomeComponent {
displayedColumns = ['select', 'num', 'name'];
dataSource = new MatTableDataSource<Element>(ELEMENT_DATA);
@ViewChild(MatPaginator) paginator: MatPaginator;
/**
* Set the paginator after the view init since this component will
* be able to query its view for the initialized paginator.
*/
ngAfterViewInit() {
this.dataSource.paginator = this.paginator;
}
selection = new SelectionModel<Element>(true, []);
/** Whether the number of selected elements matches the total number of rows. */
isAllSelected() {
const numSelected = this.selection.selected.length;
const numRows = this.dataSource.data.length;
return numSelected === numRows;
}
/** Selects all rows if they are not all selected; otherwise clear selection. */
masterToggle() {
this.isAllSelected() ?
this.selection.clear() :
this.dataSource.data.forEach(row => this.selection.select(row));
}
deleted($event)
{
delete(this.dataSource.data.forEach(row => this.selection.select(row));)
}
}
export interface Element {
name: string;
num: number;
}
const ELEMENT_DATA: Element[] = [
{num: 1, name: 'Message1'},
{num: 2, name: 'Message2'},
{num: 3, name: 'Message3'},
{num: 3, name: 'Message4'},
{num: 4, name: 'Message5'},
{num: 5, name: 'Message6'},
];
can anybody please help me how can i remove the selected rows from the table using the button.
MatColumnDef extends CdkColumnDef Column definition for the mat-table. Defines a set of cells available for a table column. Selector: [matColumnDef]
The mat-table provides a Material Design styled data-table that can be used to display rows of data. This table builds on the foundation of the CDK data-table and uses a similar interface for its data input and template, except that its element and attribute selectors will be prefixed with mat- instead of cdk- .
You should be removing the selected items and refresh the datasource
as below,
removeSelectedRows() {
this.selection.selected.forEach(item => {
let index: number = this.data.findIndex(d => d === item);
console.log(this.data.findIndex(d => d === item));
this.data.splice(index,1)
this.dataSource = new MatTableDataSource<Element>(this.data);
});
this.selection = new SelectionModel<Element>(true, []);
}
LIVE DEMO
You can use the renderRows()
method from the MatTable
API.
This way you don't have to re-instantiate the array on every click.
Check-out the Live 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