【问题标题】:Angular Material *matNoDataRow doesn't work角材料 *matNoDataRow 不起作用
【发布时间】:2020-10-23 04:23:38
【问题描述】:

我制作了一个 MatTable,您可以在其中进行过滤。如果没有与过滤器匹配的数据,我想使用 Angular Material 文档中提到的 *ma​​tNoDataRow 指令显示文本。但是,它不像 Angular Material 的示例那样工作。 有什么我忘记了吗?还是该指令尚未生效? 我使用 Angular 9。

这是我的桌子:

<mat-form-field color="accent" appearance="fill" >
    <mat-label >Filter</mat-label>
    <input matInput (keyup)="doFilter($event.target.value)" placeholder="filter this table" (click)="searching=true" #input >
    <button mat-icon-button matSuffix (click)="input.value=''; doFilter(''); searching= !searching" color="accent">
        <mat-icon *ngIf="!searching">search</mat-icon>
        <mat-icon *ngIf="searching">clear</mat-icon>
    </button>
</mat-form-field>

<div class="sticky-container" style="margin-top: 2em;">
    <table mat-table [dataSource]="dataSource" class="mat-elevation-z8" matSort matSortActive="EXPIRY DATE" matSortDirection="asc" matSortDisableClear>

        <ng-container matColumnDef="id">
            <th mat-header-cell *matHeaderCellDef mat-sort-header>CUSTOMER ID</th>
            <td mat-cell *matCellDef="let customer; let i = index" class="no-outline" 
                routerLink="/summary/customer/{{customerService.id}}">{{customer.id}}</td>
        </ng-container>

        <ng-container matColumnDef="exDate">
            <th mat-header-cell *matHeaderCellDef mat-sort-header>EXPIRY DATE</th>
            <td mat-cell *matCellDef="let customer; let i = index" class="table-bold no-outline" 
                routerLink="/summary/customer/{{customerService.id}}">{{customer.exDate | date: "dd.MM.yyyy"}}</td>
        </ng-container>

        <ng-container matColumnDef="companyName">
            <th mat-header-cell *matHeaderCellDef mat-sort-header>COMPANY / PARTNER</th>
            <td mat-cell *matCellDef="let customer; let i = index"  class="no-outline" 
                routerLink="/summary/customer/{{customerService.id}}">{{customer.companyName}}</td>
        </ng-container>

        <ng-container matColumnDef="export">
            <th mat-header-cell *matHeaderCellDef></th>
            <td mat-cell *matCellDef="let customer; let i = index">
                <button mat-icon-button matTooltip="export" (click)="export()">
                    <mat-icon color="primary">get_app</mat-icon>
                </button>
            </td>
        </ng-container>
        
        <tr mat-header-row *matHeaderRowDef="displayedColumns; sticky: true" ></tr>
        <tr mat-row *matRowDef="let row; columns: displayedColumns; let i = index" (mouseover)="customerService.getId([row.id])"></tr>
        
        <!-- Row shown when there is no matching data.-->
        <tr class="mat-row" *matNoDataRow>
            <td class="mat-cell" colspan="4">No data matching the filter "{{input.value}}"</td>
        </tr>

    </table>
    
    <mat-paginator [pageSize]="10" [pageSizeOptions]="[10, 20, 30, 100, dataSource.data.length]" color="accent"></mat-paginator>
</div>

更新:我实现它的方式是正确的。它不起作用的唯一原因是我必须将 Angular 更新到版本 10。

【问题讨论】:

  • 是正确的指令 CdkNoDataRow 吗?我在 Angular 材料文档中看到了这一点
  • 我实现它的方式是正确的。它不起作用的唯一原因是我必须将我的 Angular 更新到版本 10。请参阅下面的答案。

标签: angular angular-material


【解决方案1】:

该功能仅在最新版本的 Angular (v10) 中可用。如果您将文档切换为显示 v9(现在显示为 9.2.4),您将看到该功能不是 API 的一部分。

也就是说,我也无法让它工作。即使在 Angular 10 中。:(

更新:我确实让它工作了。 (我使用的是 Angular 10.0.1)。我的工作代码看起来与您实现它的方式完全相同。所以升级到 Angular 10 应该可以解决问题。

【讨论】:

  • 对于任何试图使其工作的人,还有两点需要考虑: 1. 将CdkColumnDef 添加到模块的提供者,其中的组件正在使用此功能。否则您将看到NullInjectorError: No provider for CdkColumnDef!,即使MatTableModule 已导入。 2. 使用&lt;tr class="mat-row" *matNoDataRow&gt; 而不是&lt;tr mat-row *matNoDataRow&gt;。否则,您将看不到带有消息的 &lt;td&gt;,也看不到错误。
  • 我发现此功能的最佳文档来源(包括 mat-table 示例)是 github 存储库中的单元测试:github.com/angular/components/blob/master/src/material/table/…
  • @Navruzbek Noraliev 我认为 MatNoDataRow 不适用于 mat-row,因为 mat-row 不接受内容。我不得不使用 并垂直对齐单元格。
  • 当你使用 *matNoDataRow 有效。看看我的主要问题。唯一的问题是我必须将 Angular Material 更新到版本 10。
  • 还有一件更重要的事情。您应该使用&lt;td class="mat-cell"&gt; 而不是&lt;td mat-cell&gt;
【解决方案2】:

我同意杰西的观点。它在 Angular 10 中运行良好。您的代码没有任何问题。甚至我也做了同样的检查。

<tr class="mat-row" *matNoDataRow>
    <td class="mat-cell" colspan="4">No data found</td>
</tr>

【讨论】:

    猜你喜欢
    相关资源
    最近更新 更多
    热门标签