angular - PrimeNg turbotable 过滤器不适用于行组
问题描述
我有一个p-table
使用行分组和过滤功能的。这些功能本身就可以正常工作,但是当我一起使用它们时,在应用任何过滤器时,分组的第一列都会消失。这发生在所有分组类型(子标题、行跨度等)上。
下面的代码显示了一个包含四列的简单表,其中第一列 (EmpName) 分组为 Rowspan。对每一列都应用了一个简单的过滤器。当表格第一次出现时,它看起来很好。一旦您在过滤器中键入任何内容,第一个值 (empName) 就会消失并且值会出现偏差,即第二列的值会显示在第一列中,依此类推。任何帮助或指示将不胜感激。谢谢!
<h3>Rowspan</h3>
<p-table #dt [columns]="cols" [value]="empList" sortField="empName" sortMode="single" (onSort)="onSort()">
<ng-template pTemplate="header" let-columns>
<tr>
<th *ngFor="let col of columns" [pSortableColumn]="col.field">
{{col.header}}
<p-sortIcon [field]="col.field"></p-sortIcon>
</th>
</tr>
<tr>
<th *ngFor="let col of columns" [ngSwitch]="col.field">
<input *ngSwitchCase="'empName'" pInputText type="text" (input)="dt.filter($event.target.value, col.field, col.filterMatchMode)">
<input *ngSwitchCase="'empNbr'" pInputText type="text" (input)="dt.filter($event.target.value, col.field, col.filterMatchMode)">
<input *ngSwitchCase="'empDept'" pInputText type="text" (input)="dt.filter($event.target.value, col.field, col.filterMatchMode)">
<input *ngSwitchCase="'empHrs'" pInputText type="text" (input)="dt.filter($event.target.value, col.field, col.filterMatchMode)">
</th>
</tr>
</ng-template>
<ng-template pTemplate="body" let-rowData let-rowIndex="rowIndex">
<tr>
<td *ngIf="rowGroupMetadata[rowData.empName].index === rowIndex" [attr.rowspan]="rowGroupMetadata[rowData.empName].size">
{{rowData.empName}}
</td>
<td>{{rowData.empNbr}}</td>
<td>{{rowData.empDept}}</td>
<td>{{rowData.empHrs}}</td>
</tr>
</ng-template>
</p-table>
import { Component } from '@angular/core';
import { MenuItem } from 'primeng/api';
import {SelectItem} from 'primeng/api';
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.scss']
})
export class AppComponent {
empList: any = [];
rowGroupMetadata: any;
cols: any[];
constructor() {}
ngOnInit(): void {
this.empList = [
{empName:'John Smith', empNbr:1111, empDept:'Finance', empHrs:16},
{empName:'John Smith', empNbr:1111, empDept:'Finance', empHrs:5},
{empName:'John Smith', empNbr:1111, empDept:'Finance', empHrs:8},
{empName:'Tom Smith', empNbr:2222, empDept:'Admin', empHrs:12},
{empName:'Tom Smith', empNbr:2222, empDept:'Admin', empHrs: 10},
{empName:'Bob Smith', empNbr:3333, empDept:'Marketing', empHrs: 8},
{empName:'Bob Smith', empNbr:3333, empDept:'Marketing', empHrs: 12},
{empName:'Bob Smith', empNbr:3333, empDept:'Marketing', empHrs: 20},
{empName:'Bob Smith', empNbr:3333, empDept:'Marketing', empHrs: 22},
{empName:'Mary Smith', empNbr:4444, empDept:'Sales', empHrs: 28},
];
this.cols = [
{ field: 'empName', header: 'EmpName'},
{ field: 'empNbr', header: 'EmpNbr'},
{ field: 'empDept', header: 'EmpDept'},
{ field: 'empHrs', header: 'EmpHrs'}
];
this.updateRowGroupMetaData();
}
onSort() {
this.updateRowGroupMetaData();
}
updateRowGroupMetaData() {
this.rowGroupMetadata = {};
if (this.empList) {
for (let i = 0; i < this.empList.length; i++) {
let rowData = this.empList[i];
let empName = rowData.empName;
if (i == 0) {
this.rowGroupMetadata[empName] = { index: 0, size: 1 };
}
else {
let previousRowData = this.empList[i - 1];
let previousRowGroup = previousRowData.empName;
if (empName === previousRowGroup)
this.rowGroupMetadata[empName].size++;
else
this.rowGroupMetadata[empName] = { index: i, size: 1 };
}
}
console.log(this.rowGroupMetadata);
}
}
}
解决方案
onFilter(event) {
this.updateRowGroupMetaData(event.filteredValue);
}
updateRowGroupMetaData(data) {
this.rowGroupMetadata = {};
if (data) {
for (let i = 0; i < data.length; i++) {
let rowData = data[i];
let brand = rowData.brand;
if (i == 0) {
this.rowGroupMetadata[brand] = { index: 0, size: 1 };
}
else {
let previousRowData = this.cars[i - 1];
let previousRowGroup = previousRowData.brand;
if (brand === previousRowGroup)
this.rowGroupMetadata[brand].size++;
else
this.rowGroupMetadata[brand] = { index: i, size: 1 };
}
}
}
}
<p-table ... (onFilter)="onFilter($event)">
参考:点击这里。
推荐阅读
- amazon-web-services - 恢复 AWS RDS 数据库但在“默认”以外的不同安全组中?
- reactjs - 无法在 @monaco-editor/react 中更改主题
- javascript - 未处理的拒绝 (SecurityError):尝试使用 history.pushState() 超过 100 次每 30 秒反应
- python - 是否可以在 tensorflow 中合并两个模型?
- python - 如何使用 Python 解码 Angular 的自定义 HTML 编码
- typescript - 使用 Typescript 泛型来限制函数输入参数
- user-interface - TabControl 和 ObservableCollection UI 刷新
- html - 如何在“脱落”图像的图像上添加文本
- python - 如何使用 Django ORM 增加 Django CharField(包含一个整数)?
- javascript - 每 5 秒调用一次 onChange 函数