Angular 删除记录后刷新 table,使用 material table 并休息 api
Angular refresh table after delete record, using material table and rest api
我有一个 material Table 具有可扩展的行(https://material.angular.io/components/table/examples) and I want to manage delete into the table itself, so I create a delete button with a function that trigger the delete event. The api works, the record is correctly deleted, but the table is not refreshed after delete, and I want to implement this behaviour. Here a stackblitz with fake api: https://stackblitz.com/edit/angular-comzph
我尝试在我的删除函数中调用 ngOnInt 并导航回相同的路线,但没有任何反应...
deleteCustomer(id) {
this.api.deleteCustomer(id)
.subscribe(res => {
alert(`cliente rimosso`);
// TODO fix reload list after delete
// this.router.navigate['/clienti'];
this.ngOnInit();
}, (err) => {
console.log(err);
}
);
}
我尝试使用 ,但不起作用。我尝试使用 ngOnChange 和 ngOnDestroy,但也不起作用...
有人可以帮我吗?
我解决了每次刷新客户列表时为 mat-table 创建新数据源的问题。我需要向我的构造函数提供 ChangeDetectorRef
,然后编写此代码:
refreshCustomersList() {
this.api.getCustomers()
.subscribe(res => {
console.log(res);
this.clienti = res;
this.dataSource = new ClientiDataSource(this.api);
this.changeDetectorRefs.detectChanges();
}, err => {
console.log(err);
});
}
而且有效!
注意:只有在使用 mat-table 数据源时才会出现此问题
更新后的数据无需调用服务器重新下载所有数据。只需调用此函数(如下)并删除数据源中的行(拼接)即可。从您的删除函数中传入记录 ID,无论列名是您的 ID 所在的位置,魔术都会发生。我包括分页器。
我用于创建和更新的 StackBlitz for Angular Material Table has a working example. Also see my UpdateDatatableService。
// Remove the deleted row from the data table.
// Need to remove from the downloaded data first.
private deleteRowDataTable (recordId, idColumn, paginator, dataSource) {
this.dsData = dataSource.data;
const itemIndex = this.dsData.findIndex(obj => obj[idColumn] === recordId);
dataSource.data.splice(itemIndex, 1);
dataSource.paginator = paginator;
}
Angular 文档显示有一种方法 renderRows()
可用于 <table mat-table>
元素。我遇到了同样的问题,实现了这个方法,效果很好。我还了解到您可以选择提供数据流而不是简单数据。下面解决简单数据行的渲染。
在您的 HTML 模板中,为 <table mat-table>
元素提供一个 属性 绑定:
<table mat-table [dataSource]="data" #myTable> <!-- #table binding here -->
<!-- table cells content etc... -->
</table>
在你的组件class中,link用@ViewChild到模板属性,当table数据变化时调用renderRows()
方法。
import { MatTable } from '@angular/material/table';
export class MyComponent {
@ViewChild('myTable') myTable: MatTable<any>; /*not exatly sure what the type should be set too */
editDataMethod(){
/* data handling logic */
this.myTable.renderRows();
}
我有一个 material Table 具有可扩展的行(https://material.angular.io/components/table/examples) and I want to manage delete into the table itself, so I create a delete button with a function that trigger the delete event. The api works, the record is correctly deleted, but the table is not refreshed after delete, and I want to implement this behaviour. Here a stackblitz with fake api: https://stackblitz.com/edit/angular-comzph
我尝试在我的删除函数中调用 ngOnInt 并导航回相同的路线,但没有任何反应...
deleteCustomer(id) {
this.api.deleteCustomer(id)
.subscribe(res => {
alert(`cliente rimosso`);
// TODO fix reload list after delete
// this.router.navigate['/clienti'];
this.ngOnInit();
}, (err) => {
console.log(err);
}
);
}
我尝试使用
有人可以帮我吗?
我解决了每次刷新客户列表时为 mat-table 创建新数据源的问题。我需要向我的构造函数提供 ChangeDetectorRef
,然后编写此代码:
refreshCustomersList() {
this.api.getCustomers()
.subscribe(res => {
console.log(res);
this.clienti = res;
this.dataSource = new ClientiDataSource(this.api);
this.changeDetectorRefs.detectChanges();
}, err => {
console.log(err);
});
}
而且有效!
注意:只有在使用 mat-table 数据源时才会出现此问题
更新后的数据无需调用服务器重新下载所有数据。只需调用此函数(如下)并删除数据源中的行(拼接)即可。从您的删除函数中传入记录 ID,无论列名是您的 ID 所在的位置,魔术都会发生。我包括分页器。
我用于创建和更新的 StackBlitz for Angular Material Table has a working example. Also see my UpdateDatatableService。
// Remove the deleted row from the data table.
// Need to remove from the downloaded data first.
private deleteRowDataTable (recordId, idColumn, paginator, dataSource) {
this.dsData = dataSource.data;
const itemIndex = this.dsData.findIndex(obj => obj[idColumn] === recordId);
dataSource.data.splice(itemIndex, 1);
dataSource.paginator = paginator;
}
Angular 文档显示有一种方法 renderRows()
可用于 <table mat-table>
元素。我遇到了同样的问题,实现了这个方法,效果很好。我还了解到您可以选择提供数据流而不是简单数据。下面解决简单数据行的渲染。
在您的 HTML 模板中,为 <table mat-table>
元素提供一个 属性 绑定:
<table mat-table [dataSource]="data" #myTable> <!-- #table binding here -->
<!-- table cells content etc... -->
</table>
在你的组件class中,link用@ViewChild到模板属性,当table数据变化时调用renderRows()
方法。
import { MatTable } from '@angular/material/table';
export class MyComponent {
@ViewChild('myTable') myTable: MatTable<any>; /*not exatly sure what the type should be set too */
editDataMethod(){
/* data handling logic */
this.myTable.renderRows();
}