【问题标题】:Set minimum number of rows on angular material table设置角材料表上的最小行数
【发布时间】:2020-02-03 15:10:41
【问题描述】:

我正在尝试显示一个具有最小高度的角垫表。如果没有可用数据,我希望它只显示空行。

我看过这篇文章Angular Material Table set default number of rows

但我不知道显示响应的行数。有人解决了这个问题吗?我还没有找到任何东西。

编辑 似乎我对这个问题并不清楚,因为所有答案都不太合适。

我希望能够有一个响应大小的 div 或容器(可能是表格元素本身)。如果页面大小垂直更改,容器将垂直增长和收缩。可见的行数(无论是否有可用的数据)也应该根据可用的表/容器高度增加或减少

谢谢

【问题讨论】:

  • 如果只有 1 或 2 行怎么办?你想让它们伸展到桌子的高度吗?
  • 不,我希望表格是一个响应高度,并且根据填充高度所需的行数增加或减少

标签: angular angular-material mat-table


【解决方案1】:

如果数据为 1,则默认设置最少 5 行空白,然后通过检查存在的数据行数将空白行数设置为 4

【讨论】:

    【解决方案2】:

    首先设置 mat-table 分页值,“pageSizeOptions”中的第一个值是您的默认显示行数。

    <mat-paginator [pageSizeOptions]="[5, 10, 20]" showFirstLastButtons></mat-paginator>
    

    这样做,您将始终在每页上显示 5 行,如我们上面指定的那样。

    这是一个代码示例,如果您的动态数据为空,您将如何生成“虚拟”数据

        private getData() {
           const EMPTY_DATA: PeriodicElement[] = [
              {position: null, name: null, weight: null, symbol: null},
              {position: null, name: null, weight: null, symbol: null},
              {position: null, name: null, weight: null, symbol: null},
              {position: null, name: null, weight: null, symbol: null},
              {position: null, name: null, weight: null, symbol: null}
           ];
    
           this.dataSource.data = EMPTY_DATA;
           this.dataService.getAll().subscribe(data => {
              if (!data) return;
              this.dataSource.data = data;
        }
    

    【讨论】:

    • 我目前没有使用分页,也没有计划,因为我希望表格滚动。我仍然不确定这是否可行。如果您的源中只有两个数据项,但最小页面大小为五,它仍然只会显示两行,不是吗?它不会像我想要的那样显示两行加上空白行来填充表格高度
    • @kamcknig 如果您使用分页,我的示例将起作用。是的,如果您的默认页面大小为 5,但动态数据只有 2 行,它只会显示 2 行。由于我的代码示例覆盖了“虚拟行”,因此只有动态数据会显示在数据表中。 “默认页面大小”仅用于设置最大每页显示的行数
    【解决方案3】:

    我会这样做:

    ts

    getData() {
      this.service.getData().subscribe(r => {
        const minLength = window.innerHeight / x; // x is your row height
        if (!r) {
          r = new Array(minLength);
        } else {
          if (r.length < minLength) {
            r.push(...new Array(minLength - r.length))
          }
        }
        this.dataSource.data = r;
      });
    }
    

    注意:要使用它,我建议您使用安全导航运算符:

    https://angular.io/guide/template-syntax#safe-navigation-operator

    如果你的 API 总是返回一个数组,并且如果没有数据返回 [],你可以删除第一个 if else。

    getData() {
      this.service.getData().subscribe(r => {
        const minLength = window.innerHeight / x; // x is your row height
        if (r.length < minLength) {
          r.push(...new Array(minLength - r.length))
        }
        this.dataSource.data = r;
      });
    }
    

    【讨论】:

    • 如前所述,我不知道行数。我希望表格具有响应高度以及根据表格高度增加或减少的行数,无论是否有可用数据
    • 哦,好吧。您可以根据 window.innerWidth 创建 minRows,如下所示: minRows = window.innerHeight / x 其中 x 是 mat-table 的行高。如果您想在每次视图大小更改时调整大小,您可以添加 @HostListener('window:resize', ['$event''])
    • 好的,看看 API,我没有看到任何内置的东西,所以假设我可能不得不做这样的事情。想确保我没有遗漏一些明显的东西。我的应用程序是桌面应用程序,因此我希望表格填充可用高度,例如在最大化的桌面应用程序中。可能与通常您希望它占用尽可能少空间的网络有点不同
    • 是的,但是没有办法从桌面应用程序中获取高度?应该以同样的方式工作,只需替换 window.innerHeight
    • 当然,我可以做这样的事情,只是想确保没有更简单的方法不存在。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多