[英]Angular > filter in Material table
在 Angular 中,我使用帶有擴展行的 Material 表,我想用 RequestId 過濾它
表樹.html
<div class="filter">
<span>
<h5 class="requestid">Request ID</h5>
<input type="text" [(ngModel)]="requestFilter" />
</span>
</div>
<table mat-table [dataSource]="dataSource" multiTemplateDataRows class="mat-elevation-z8">
<ng-container matColumnDef="{{column}}" *ngFor="let column of columnsToDisplay">
<th mat-header-cell *matHeaderCellDef>{{columnNames[column]}}</th>
<td mat-cell *matCellDef="let element">
{{element[column]}}
</td>
</ng-container>
<ng-container matColumnDef="expandedDetail">
<td mat-cell *matCellDef="let element" [attr.colspan]="columnsToDisplay.length">
<div class="example-element-detail" [@detailExpand]="element == expandedInfo ? 'expanded' : 'collapsed'">
<div class="example-element-position">{{element.creationDate}}</div>
<div class="example-element-description">
{{element.serialNumberProductRefToSupply}}
</div>
<div class="example-element-description">
{{element.serialNumberOriginSupplyToDestination}}
</div>
</div>
</td>
</ng-container>
<tr mat-header-row *matHeaderRowDef="columnsToDisplay"></tr>
<tr mat-row *matRowDef="let element; columns: columnsToDisplay;" class="example-element-row"
[class.example-expanded-row]="expandedInfo === element" (click)="expandedInfo = element"></tr>
<tr mat-row *matRowDef="let row; columns: ['expandedDetail']" class="example-detail-row"></tr>
</table>
表樹.ts
import { Component } from '@angular/core';
import {
animate,
state,
style,
transition,
trigger
} from '@angular/animations';
@Component({
selector: 'table-tree',
styleUrls: ['table-tree.css'],
templateUrl: 'table-tree.html',
animations: [
trigger('detailExpand', [
state(
'collapsed',
style({ height: '0px', minHeight: '0', display: 'none' })
),
state('expanded', style({ height: '*' })),
transition(
'expanded <=> collapsed',
animate('225ms cubic-bezier(0.4, 0.0, 0.2, 1)')
)
])
]
})
export class TableTree {
dataSource = MoveOrderData;
expandedInfo: MoveOrderAuthorizations;
requestFiltered = '';
get requestFilter(): string {
return this.requestFiltered;
}
set requestFilter(value: string) {
console.log(value);
this.requestFiltered = value;
this.filteredRequests = this.performFilter(value);
}
filteredRequests: MoveOrderAuthorizations[] = [];
performFilter(filterBy: string): MoveOrderAuthorizations[] {
filterBy = filterBy.toLocaleLowerCase();
return this.dataSource.filter((request: MoveOrderAuthorizations) =>
request.requestId.includes(filterBy));
}
columnsToDisplay = [
'creationDate',
'requestId',
'issue',
'requestType',
'managedBy',
'serialNumberProductRefToSupply',
'serialNumberOriginSupplyToDestination'
];
columnNames = {
creationDate: 'Creation Date',
requestId: 'Request ID',
issue: 'Issue',
requestType: 'Request Type',
managedBy: 'Managed by',
serialNumberProductRefToSupply: 'Product ref to supply',
serialNumberOriginSupplyToDestination: 'Origin supply to Destination'
};
responseColumnsToDisplay = ['moveorderId', 'originDestination', 'status'];
subColumnNames = {
moveorderId: 'Move Order ID',
originDestination: 'Origin Destination',
status: 'Status'
};
}
export interface MoveOrderAuthorizations {
creationDate: string;
requestId: string;
issue: string;
requestType: string;
managedBy: string;
serialNumberProductRefToSupply: string;
serialNumberOriginSupplyToDestination: string;
}
const MoveOrderData: MoveOrderAuthorizations[] = [
{
creationDate: `01/01/2021`,
requestId: '139322',
issue: ``,
requestType: `Evacuation`,
managedBy: `AGV`,
serialNumberProductRefToSupply: `ML132345XO1211321AND11432001`,
serialNumberOriginSupplyToDestination: `SA-11EOL-LN001`
},
{
creationDate: `01/01/2021`,
requestId: '254982',
issue: `Destination not found`,
requestType: `Supply`,
managedBy: `AGV`,
serialNumberProductRefToSupply: `ML132345XO1211321AND11432002`,
serialNumberOriginSupplyToDestination: `RE-11WIP-11E03`
}
];
我用 getter 和 setter 寫了一個方法來過濾顯示的數據,但有些東西遺漏了,它不起作用。
performFilter(filterBy: string): MoveOrderAuthorizations[] {
filterBy = filterBy.toLocaleLowerCase();
return this.dataSource.filter((request: MoveOrderAuthorizations) =>
request.requestId.includes(filterBy));
}
requestFiltered = '';
get requestFilter(): string {
return this.requestFiltered;
}
set requestFilter(value: string) {
console.log(value);
this.requestFiltered = value;
this.filteredRequests = this.performFilter(value);
}
filteredRequests: MoveOrderAuthorizations[] = [];
你可以去 Stackblitz 上查看表格 > [https://stackblitz.com/edit/tab-tree-filter?file=app/table-tree.ts][1]
謝謝 :)
這里的問題是您正在為 mat-table 使用數據源變量。 但是,當您過濾項目時,您會將它們存儲在另一個名為 requestsFiltered 的數組中,而不是更新數據源。 因此,即使項目被過濾,表格也不會更新。
請檢查更新的代碼。
已完成更改(根據 stackblitz 代碼):
HTML(使數據源成為 requestFiltered):
<table mat-table [dataSource]="filteredRequests" multiTemplateDataRows class="mat-elevation-z8">
TS:
ngOnInit() {
this.filteredRequests = this.dataSource;
}
performFilter(filterBy: string): MoveOrderAuthorizations[] {
filterBy = filterBy.toLocaleLowerCase();
this.filteredRequests = this.dataSource.filter(
(request: MoveOrderAuthorizations) => request.requestId.includes(filterBy)
);
return !!filterBy && this.filteredRequests.length > 0
? this.filteredRequests
: this.dataSource;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.