当过滤器与以下项不匹配时,我尝试显示一个空消息错误:
<div *ngIf="dataSource.length === 0">No data</div>
但是它不起作用,因为我使用MatTableDataSource构建了一个动态表。
为了更好地理解,我将动态表更改为预定义的数组。
const ELEMENT_DATA: MembersElement[] = [
{ name: 'Jenny', age: 17 },
{ name: 'Daniel', age: 18 }
];
但是,必须使用MatTableDataSource来动态构建用户表
这是我所有的ts代码。
import { Component, OnInit } from '@angular/core';
import {MatTableDataSource} from '@angular/material';
export interface SociosElement {
nombre: string;
edad: number;
}
const ELEMENT_DATA: MembersElement[] = [
{ name: 'Jenny', age: 17 },
{ name: 'Daniel', age: 18 }
];
@Component({
selector: 'app-pruebas',
templateUrl: './tableMembers.component.html',
styleUrls: ['./tableMembes.component.css']
})
export class PruebasComponent {
displayedColumns: string[] = ['name', 'age'];
dataSource = new MatTableDataSource(ELEMENT_DATA);
applyFilter(filterValue: string) {
this.dataSource.filter = filterValue.trim().toLowerCase();
}
}
这是我的HTML代码。
<mat-toolbar color="primary">My full table</mat-toolbar>
<mat-form-field>
<input matInput (keyup)="applyFilter($event.target.value)" placeholder="Filter">
</mat-form-field>
<mat-table #table [dataSource]="dataSource">
<ng-container matColumnDef="name">
<mat-header-cell *matHeaderCellDef mat-sort-header>Name </mat-header-cell>
<mat-cell *matCellDef="let element"> {{element.name}} </mat-cell>
</ng-container>
<ng-container matColumnDef="age">
<mat-header-cell *matHeaderCellDef mat-sort-header>Age </mat-header-cell>
<mat-cell *matCellDef="let element"> {{element.age}} </mat-cell>
</ng-container>
<mat-header-row *matHeaderRowDef="displayedColumns"></mat-header-row>
<mat-row *matRowDef="let row; columns: displayedColumns;" (click)="row.toggle(row)">
</mat-row>
</mat-table>
<div *ngIf="dataSource.length === 0">No data</div>
答案 0 :(得分:4)
仅使用*ngIf="dataSource.length === 0"
条件就无法达到所需的条件,因为进行过滤时数据源根本不会改变。您要做的就是当心过滤后的数据长度。您可以使用以下内容:
*ngIf="dataSource.filteredData.length > 1"
作为条件。 datasource.filteredData的长度根据过滤的结果而变化。这种情况可以隐藏您的桌子。您可以将其放在表格标签中,例如:
<table mat-table [dataSource]="dataSource" *ngIf="dataSource.filteredData.length > 1">
答案 1 :(得分:0)
使用ngIf的一个警告。如果您使用的是matSort并使用* ngIf将表嵌套在一个块内,则排序将不起作用,因为ngIf将viewChild设置为undefined。 Reference
使用[ngClass]解决此问题
<div [ngClass]="dataSource.filteredData.length > 0 ? 'visible': 'hidden'">
<mat-table #table [dataSource]="dataSource" matSort>
<ng-container matColumnDef="name">
<mat-header-cell *matHeaderCellDef mat-sort-header>Name </mat-header-cell>
<mat-cell *matCellDef="let element"> {{element.name}} </mat-cell>
</ng-container>
<ng-container matColumnDef="age">
<mat-header-cell *matHeaderCellDef mat-sort-header>Age </mat-header-cell>
<mat-cell *matCellDef="let element"> {{element.age}} </mat-cell>
</ng-container>
<mat-header-row *matHeaderRowDef="displayedColumns"></mat-header-row>
<mat-row *matRowDef="let row; columns: displayedColumns;" (click)="row.toggle(row)">
</mat-row>
</mat-table>
</div>
<div [ngClass]="dataSource.filteredData.length > 0 ? 'hidden': 'visible'">
<tr>No results found.</tr>
</div>
这是这些类的CSS
.hidden {
visibility: hidden;
}
.visible {
visibility: visible;
}
答案 2 :(得分:0)
对于v10之前的mat-table,您可以在dataSource为空时为该表提供一行数据,方法是:
[dataSource]="dataSource.data.length > 0 && dataSource.data.filteredData > 0 ? dataSource : emptyDataSource"
然后为您的单元格创建一列def以显示空数据消息:
<ng-container vdlColumnDef="empty-row"> <td *matCellDef="let row" mat-cell [colSpan]="displayedColumns.length">No Data</td> </ng-container>
然后更改行定义以在dataSource为空时显示空行列def:
<tr mat-row *matRowDef="let row; columns: dataSource.data.length > 0 && dataSource.data.filteredData > 0 ? displayedColumns : ['empty-row'];">
https://stackblitz.com/edit/angular-mat-table-no-data?file=src%2Fapp%2Ftable-basic-flex-example.html
在Angular Material 10之后,他们为表中没有数据的情况添加了一条指令:“如果要在没有数据与过滤器匹配时显示消息,则可以使用* matNoDataRow指令。” https://v10.material.angular.io/components/table/overview#filtering