【问题标题】:Angular 6 Material Data Table with Fixed Header and Paginator带有固定标题和分页器的 Angular 6 材质数据表
【发布时间】:2018-08-06 13:53:01
【问题描述】:

如何让Data Table组件的Header固定在顶部,Paginator固定在底部?

这是我的 HTML:

<div class="example-container mat-elevation-z8">

    <table mat-table #itemsTable [dataSource]="dataSource" class="items-list">

        <ng-container matColumnDef="position">
            <th mat-header-cell *matHeaderCellDef> No. </th>
            <td mat-cell *matCellDef="let element"> {{element.position}} </td>
        </ng-container>

        <ng-container matColumnDef="name">
            <th mat-header-cell *matHeaderCellDef> Name </th>
            <td mat-cell *matCellDef="let element"> {{element.name}} </td>
        </ng-container>

        <ng-container matColumnDef="weight">
            <th mat-header-cell *matHeaderCellDef> Weight </th>
            <td mat-cell *matCellDef="let element"> {{element.weight}} </td>
        </ng-container>

        <ng-container matColumnDef="symbol">
            <th mat-header-cell *matHeaderCellDef> Symbol </th>
            <td mat-cell *matCellDef="let element"> {{element.symbol}} </td>
        </ng-container>

        <tr mat-header-row *matHeaderRowDef="this.componentsDataService.displayedColumns"></tr>
        <tr mat-row *matRowDef="let row; columns: this.componentsDataService.displayedColumns;" (click)="onRowClicked(row)"></tr>
    </table>

    <mat-paginator [pageSizeOptions]="[50, 100, 250]" showFirstLastButtons></mat-paginator>

</div>

我尝试将sticky 添加到文档中的&lt;tr mat-header-row&gt;,但它不起作用。

我在 .ts 文件中的导入:

 import { Component, OnInit, OnChanges, Input, ViewChild } from '@angular/core';
 import { TabsDataService } from 'src/app/services/tabs-data.service';
 import { ComponentsDataService } from 'src/app/services/components-data.service';
 import { MatPaginator, MatTableDataSource, MatTable, MatTableModule } from '@angular/material'

;

【问题讨论】:

  • 你已经尝试了什么?您的代码结构如何?
  • @chiril.sarajiu 我已经添加了我的代码
  • 你的相关代码还不止这些,你导入所需模块的TS在哪里?
  • 简而言之stackoverflow
  • 你为什么需要我的 ts 文件?一切正常我只想要粘性标题

标签: angular angular-material


【解决方案1】:

我在material site 的示例中发现,可以通过向 matHeaderRowDef 添加粘性来修复标题:

<tr mat-header-row *matHeaderRowDef="displayedColumns; sticky: true">

对于分页器,我在 mat-paginator 中添加了一个类:

<mat-paginator ...
                class="mat-paginator-sticky"> 

使用基于 cmets 中提供的link@frederik 答案的类

.mat-paginator-sticky {
  bottom: 0px;
  position: sticky;
  z-index: 10;
}

【讨论】:

  • 好的,这对我帮助很大!谢谢!在我使用mat-cardmat-card-titelmat-card-content(包含表格)和mat-card-footer(包含分页器)来实现一些类似的设计之前。但我更喜欢这种解决方案。
  • 注意:我的行实际上看起来像:&lt;mat-header-row *matHeaderRowDef="displayedColumns; sticky: true"&gt;&lt;/mat-header-row&gt;
【解决方案2】:

根据材料 8.1

  1. 对于粘性标题,我们需要提供一个粘性值,如这里的许多答案所示

  2. 用于粘性分页器或底部固定分页器。

我们可以用 max-height 或 height CSS 属性将表格包装在一个 div 中,并将 paninator 放在该 div 之外。

HTML 代码示例。

 <div class="mat-elevation-z2">
    <div class="table-container">

      <!--- List of column definitions here --->
      <table mat-table [dataSource]="dataSource" matSort>
        <tr mat-header-row *matHeaderRowDef="displayedColumns; sticky: true"></tr>
        <tr mat-row *matRowDef="let row; columns: displayedColumns;"></tr>
      </table>

    </div>
    <mat-paginator [pageSize]="25" [pageSizeOptions]="[10, 15, 25, 100]"></mat-paginator>
 </div>

CSS

  table {
    width: 100%;
  }

  .table-container {
    max-height: calc(100vh - 155px); // or height: calc(100vh - 155px); depending on your need  change
    overflow: auto;
  }

【讨论】:

  • 这是最好的解决方案之一。我还通过将第一列设置为粘性创建了一个示例:stackblitz.com/edit/angular-p6zdti
  • 如果你希望你的整个桌子基本上是一个固定的高度,这很好,在大多数情况下,我认为这是最自然的。您可能希望通过滚动整个屏幕来向下滚动列表,但我认为用户希望表格(尤其是带有分页器的表格)具有固定大小。
【解决方案3】:

尝试更新项目中的角度材质,因为粘性属性是在 6.2.3 中添加的。

【讨论】:

  • 我不认为这应该是最好的答案。以下许多工作无需升级。
  • @Farasi78 我同意,但我这么说是因为他一开始使用了文档中的粘性属性
【解决方案4】:

下面的 css 对我有用:

<mat-header-row *matHeaderRowDef="displayedColumns"></mat-header-row>
.mat-header-row{
  position: sticky;
  top: 0;
  z-index: 100;
  background: white;
  }

【讨论】:

  • 我不知道出了什么问题,但是当我尝试通过 css 固定标题时 .mat-h​​eader-row{ position: sticky;它不起作用。仅在 html sticky 中明确指定:true 有帮助
  • @M.Laida 不应该,因为sticky的位置不在IE11中。
【解决方案5】:

我也有这个问题。我创建了一个固定大小的 div,然后将表格保存在 div 中。这应该可以解决您的问题。

<div style="height: 300px; overflow: auto">
    <table mat-table [dataSource]=dataSource>
        <!--Your table entries here -->
        . 
        .
        .
        .
        <tr mat-header-row *matHeaderRowDef="displayedColumns; sticky: true"></tr>
        <tr mat-row *matRowDef="let row; columns: displayedColumns;"></tr>
    </table>
</div>

【讨论】:

  • 正是我想要的
【解决方案6】:

您可以使用普通的粘性mat-footer-rowcolspan 并将分页器放入其中:

<table mat-table>
   ...

    <ng-container matColumnDef="paginator">
        <td mat-footer-cell *matFooterCellDef [colSpan]="displayedColumns.length">
            <mat-paginator ...></mat-paginator>
        </td>
    </ng-container>

    <tr mat-footer-row *matFooterRowDef="['paginator']; sticky: true"></tr>
</table>

并使用一些这样的风格,让它更吸引眼球:

.mat-row:last-child td {
  border-bottom: none;
}

.mat-footer-row:first-child td {
  border-top: 1px solid rgba(0, 0, 0, 0.12);
}

.mat-footer-cell .mat-paginator {
  margin-left: -24px;
  margin-right: -24px;
}

【讨论】:

  • 这太hacky了,我们可以用max-height或height CSS属性将表格包裹在一个div中,问题就解决了。
  • 这是我可以使用可变高度窗口的唯一解决方案,而无需进行 vh 计算。可能很老套,但至少它可以满足我的要求!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-10
  • 1970-01-01
  • 1970-01-01
  • 2017-01-27
  • 1970-01-01
  • 2019-05-14
相关资源
最近更新 更多