我正在使用此代码
<mat-table #table [dataSource]="dataSource" matSort >
<ng-container matColumnDef="tache">
<mat-header-cell *matHeaderCellDef mat-sort-header> tâche </mat-header-cell>
<mat-cell *matCellDef="let element"> {{element.tache}} </mat-cell>
</ng-container>
<ng-container matColumnDef="outil">
<mat-header-cell *matHeaderCellDef mat-sort-header> outil </mat-header-cell>
<mat-cell *matCellDef="let element"> {{element.outil}} </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>
那么,如何在数据表中显示空消息“No Record found”。
答案 0 :(得分:7)
对于 Angular Material 10 ,如果要在没有数据与过滤器匹配的情况下显示一条消息,则可以使用* matNoDataRow指令。
<tr class="mat-row" *matNoDataRow>
<td class="mat-cell" colspan="9999">
No data matching the filter
</td>
</tr>
答案 1 :(得分:7)
如果使用console.log dataSource,则会看到以下内容: dataSource example
不是dataSource本身就是数组,而是dataSource.data。 dataSource实际上是一个具有属性数据的类,其中包含要传递给MatTableDataSource(https://github.com/angular/material2/blob/master/src/lib/table/table-data-source.ts)的内容。因此,这就是* ngIf语句应使用的。
<div *ngIf="dataSource.data.length === 0">
No Records Found!
</div>
希望这会有所帮助!
答案 2 :(得分:5)
有两种方法可以在html中显示错误消息
使用 If 方法
的第一种方法
<div *ngIf="dataSource.length">
<mat-table #table [dataSource]="dataSource" matSort >
<ng-container matColumnDef="tache">
<mat-header-cell *matHeaderCellDef mat-sort-header> tâche </mat-header-cell>
<mat-cell *matCellDef="let element"> {{element.tache}} </mat-cell>
</ng-container>
<ng-container matColumnDef="outil">
<mat-header-cell *matHeaderCellDef mat-sort-header> outil </mat-header-cell>
<mat-cell *matCellDef="let element"> {{element.outil}} </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>
</div>
<div *ngIf="!dataSource.length">
No Record found
</div>
第二种方法使用如果
<div *ngIf="dataSource.length; else noRecord">
<mat-table #table [dataSource]="dataSource" matSort >
<ng-container matColumnDef="tache">
<mat-header-cell *matHeaderCellDef mat-sort-header> tâche </mat-header-cell>
<mat-cell *matCellDef="let element"> {{element.tache}} </mat-cell>
</ng-container>
<ng-container matColumnDef="outil">
<mat-header-cell *matHeaderCellDef mat-sort-header> outil </mat-header-cell>
<mat-cell *matCellDef="let element"> {{element.outil}} </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>
</div>
<ng-template #noRecord>
<div>
No Record found
</div>
</ng-template>
答案 3 :(得分:4)
就像bug说的那样,你可以使用*ngIf
。比较这两个表:
https://stackblitz.com/edit/angular-w9ckf8
<mat-toolbar color="primary">My empty table</mat-toolbar>
<mat-table #table [dataSource]="dataSourceEmpty" matSort *ngIf="dataSourceEmpty.length > 0">
<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="dataSourceEmpty.length === 0">No records found</div>
<hr>
<mat-toolbar color="primary">My full table</mat-toolbar>
<mat-table #table [dataSource]="dataSource" matSort *ngIf="dataSource.length > 0">
<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>
TS与数据:
displayedColumns = ['Name', 'Age']
dataSource = [{name:'Sara',age:17}, {name: 'John', age: 20}]
dataSourceEmpty = []
答案 4 :(得分:2)
在您的component-name.component.html
中:
<div class="mat-elevation-z8">
<mat-table [dataSource]="listData" matSort>
<ng-container matColumnDef="fullName">
<mat-header-cell *matHeaderCellDef mat-sort-header>Full Name</mat-header-cell>
<mat-cell *matCellDef="let element">{{element.fullName}}</mat-cell>
</ng-container>
...
...
<ng-container matColumnDef="noData">
<mat-footer-cell *matFooterCellDef colspan="6">
No data.
</mat-footer-cell>
</ng-container>
<mat-header-row *matHeaderRowDef="displayedColumns"></mat-header-row>
<mat-row *matRowDef="let row; columns: displayedColumns;"></mat-row>
<mat-footer-row *matFooterRowDef="['noData']" [ngClass]="{'hide':!(listData!=null && listData.data.length==0)}"></mat-footer-row>
</mat-table>
<mat-paginator [pageSizeOptions]="[5, 10, 25, 100]" [pageSize]="5" showFirstLastButtons></mat-paginator>
</div>
在您的style.scss
或component-name.component.scss
中定义.hide
类
.hide { display: none; }
仅此而已:)
答案 5 :(得分:2)
第0步
在ts
dataSource: any = new MatTableDataSource()
步骤1
<table [dataSource]="dataSource">
<ng-container matColumnDef="nodata">
<td mat-footer-row *matFooterCellDef [colSpan]="displayedColumns.length"
style="text-align: center;">No Data Available</td>
</ng-container>
<tr mat-footer-row
[hidden]="dataSource.data.length >0"
*matFooterRowDef="['nodata']">
</tr>
</table>
答案 6 :(得分:1)
<mat-footer-row *matFooterRowDef="['noData']" [ngClass]="{'hide':!(listData!=null && listData.filteredData.length==0)}"></mat-footer-row>
我能够通过这样做解决问题。
hide
是自定义CSS
.hide{
display:none;
}
答案 7 :(得分:0)
在.ts文件中
if (this.dataSource.length == 0) {
this.noDataMessage = true;
} else {
this.noDataMessage = false;
}
在.html文件中
<div *ngIf="noDataMessage">
<p>{{ 'label.DataNotAvailable' | translate }}</p>
</div>
答案 8 :(得分:0)
您可以通过以下方式将其放在页脚行中:
列定义:
<ng-container matColumnDef="noRecord">
<td mat-footer-cell *matFooterCellDef>No records found.</td>
</ng-container>
页脚定义:
<ng-template [ngIf]="dataSource.data.length === 0">
<tr mat-footer-row *matFooterRowDef="['noRecord']"></tr>
</ng-template>
答案 9 :(得分:0)
在较新的Angular版本中,如果您的数据源的类型为datasource.data
,请不要忘记MatTableDataSource
。
示例:
在TypeScript文件中:
// ...
datasource = new MatTableDataSource<object>([]);
// ...
在HTML文件中:
<div *ngIf="datasource.data.length > 0">
<!--Show the table.-->
</div>
<div *ngIf="datasource.data.length === 0">
<!--Show table is empty message. -->
</div>
答案 10 :(得分:0)
对于任何可以在页脚中选择执行此操作的人,我可以通过在Angular 6/7/8中执行以下步骤来执行此操作:
1)在[ComponentName] .component.html
中<table mat-table [dataSource]="dataSourceTable">
<ng-container matColumnDef="columneName">
<th mat-header-cell *matHeaderCellDef> Name </th>
<td mat-cell *matCellDef="let element"> {{element.columnname}} </td>
<td mat-footer-cell *matFooterCellDef>
<!-- Display a download button in the footer when data is available-->
<button mat-raised-button color="primary"
*ngIf="dataSourceTable.data.length > 0">Download</button>
<!--Below code is displayed when there is no data-->
<a mat-button *ngIf="dataSourceTable.data.length === 0">No Data
Found</a>
</td>
</ng-container>
<!--Below Lines of code generates Header, Row and footer for your table -->
<tr mat-header-row *matHeaderRowDef="displayedColumns; sticky: true;"></tr>
<tr mat-row *matRowDef="let row; columns: displayedColumns;">
</tr>
<tr mat-footer-row *matFooterRowDef="displayedColumns; sticky: true"></tr>
</table>
答案 11 :(得分:0)
您可以直接在dataSource上添加条件,而不必访问数据或其长度:
<div *ngIf="!yourDataSource" class="alert alert-primary" role="alert">No data </div>
答案 12 :(得分:0)
如果有人将filter
与dataSource
一起使用,则应注意dataSource.filteredData.length
。
即
if (this.dataSource.filteredData.length < 1) {
this.presentDialog();
}
或
<div class="container" *ngIf="dataSource.filteredData.length < 1">
// Your message here...
</div>
答案 13 :(得分:0)
您可以使用HTML隐藏属性实现相同的目的
<tr [hidden]="dataSource.data.length > 0" mat-footer-row *matFooterRowDef="['noRecord']" ></tr>
答案 14 :(得分:0)
这对我有用:
<ng-container matColumnDef="noRecords">
<td mat-footer-cell *matFooterCellDef>
No records found
</td>
</ng-container>
<tr mat-footer-row *matFooterRowDef="!dataSource.filteredData.length ? ['noRecords'] : []" colspan="2"></tr>
还请注意,如果您已经使用了页脚,则可能必须为每行添加一个<td mat-footer-cell *matFooterCellDef></td>
。
答案 15 :(得分:0)
我的解决方案不会更改页脚,而是通过使用CSS并在框内添加:before
页脚来显示实际表中的消息:
首先介绍一些CSS:
td.no-content {
padding-top: 7rem;
}
td.no-content:before {
content: attr(data-empty-message);
position: absolute;
top: 0;
left: 0;
right: 0;
text-align: center;
padding: 3rem 0 3rem 0;
background-color: white;
}
然后在什么都没有显示的情况下,将no-content
类添加到页脚TD:
<td mat-footer-cell *matFooterCellDef
[class.no-content]="dataSource.filteredData.length === 0"
data-empty-message="Nothing found..."
>
答案 16 :(得分:0)
如果数组为空,则会收到运行时错误“无法读取未定义的属性'length'”。 首先检查null值即可解决该问题,如果为true,则不会继续进行长度测试,因此不会引起错误。 即
<tr *ngFor="let category of _projectCategories">
<td>
{{ category.name }}
</td>
<td>
{{ category.description }}
</td>
<td>
{{ category.group }}
</td>
<td>
<i class="nc-icon" [class.nc-check-2]="category.active"
[class.nc-simple-remove]="!category.active"></i>
</td>
</tr>
<tr *ngIf="(_projectCategories==null) || (_projectCategories.length == 0)">
<td colspan="2">
Project currently has no categories.
</td>
</tr>
答案 17 :(得分:0)
您只需使用*ngIf
指令检查dataSource
是否为空。
<mat-table *ngIf="dataSource.length > 0" #table [dataSource]="dataSource" matSort >
<ng-container matColumnDef="tache">
<mat-header-cell *matHeaderCellDef mat-sort-header> tâche </mat-header-cell>
<mat-cell *matCellDef="let element"> {{element.tache}} </mat-cell>
</ng-container>
<ng-container matColumnDef="outil">
<mat-header-cell *matHeaderCellDef mat-sort-header> outil </mat-header-cell>
<mat-cell *matCellDef="let element"> {{element.outil}} </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>
<p *ngIf="dataSource.length === 0">No records found</p>