【问题标题】:Set fixed height for ngx-datatable in Angular 4在 Angular 4 中为 ngx-datatable 设置固定高度
【发布时间】:2024-01-21 15:30:02
【问题描述】:

我在 Angular 4 应用程序中使用 swimlane/ngx-datatable 设置了一个表。该表使用属性scrollbarV,因为它是必需的。我想完全按照他们提供的example 做,并为带有滚动条的表格设置一个固定高度。在附加的来源中,(对我来说)他们如何设置桌子高度并不清楚。所以我的问题是,整个表格的高度究竟是如何设置/定义的?

示例来源:

import { Component } from '@angular/core';
import {MockServerResultsService} from "./mock-server-results-service";
import {PagedData} from "./model/paged-data";
import {CorporateEmployee} from "./model/corporate-employee";
import {Page} from "./model/page";

@Component({
  selector: 'virtual-paging-demo',
  providers: [
      MockServerResultsService
  ],
  template: `
<div>
  <h3>
    Virtual Server-side Paging
    <small>
      <a href="https://github.com/swimlane/ngx-datatable/blob/master/demo/paging/paging-virtual.component.ts" target="_blank">
        Source
      </a>
    </small>
  </h3>
  <ngx-datatable
    class="material"
    [rows]="rows"
    [columns]="[{name:'Name'},{name:'Gender'},{name:'Company'}]"
    [columnMode]="'force'"
    [headerHeight]="50"
    [scrollbarV]="true"
    [footerHeight]="50"
    [rowHeight]="50"
    [externalPaging]="true"
    [count]="page.totalElements"
    [offset]="page.pageNumber"
    (page)='setPage($event)'>
  </ngx-datatable>
</div>
  `
})
export class VirtualPagingComponent {

  page = new Page();
  rows = new Array<CorporateEmployee>();
  cache: any = {};

  constructor(private serverResultsService: MockServerResultsService) {
    this.page.pageNumber = 0;
  }

  /**
   * Populate the table with new data based on the page number
   * @param page The page to select
   */
  setPage(pageInfo) {
    this.page.pageNumber = pageInfo.offset;
    this.page.size = pageInfo.pageSize;

    // cache results
    // if(this.cache[this.page.pageNumber]) return;
    this.serverResultsService.getResults(this.page).subscribe(pagedData => {
      this.page = pagedData.page;

  // calc start
  const start = this.page.pageNumber * this.page.size;

  // copy rows
  const rows = [...this.rows];

  // insert rows into new position
  rows.splice(start, 0, ...pagedData.data);

  // set rows to our new rows
  this.rows = rows;

  // add flag for results
  this.cache[this.page.pageNumber] = true;
});
  }

}

【问题讨论】:

    标签: angular ngx-datatable


    【解决方案1】:

    与您的链接 (http://swimlane.github.io/ngx-datatable/#virtual-paging) 中的示例相关联的来源具有误导性。

    在该示例中,有几件事掩盖了高度的计算方式:

    1. 样式实际上是在演示应用程序的 CSS 中设置的。
    2. 演示应用程序中的高度使用vh 单位,与视口成比例。垂直调整示例窗口的大小会自动导致示例的高度发生相应的变化。
    3. 文档中没有设置整个表格高度的公共方法,尽管可以设置其他参数,例如列宽和行高。

    设置固定高度的最常见方法是仅使用style 属性或样式表规则。使用style 属性,您可以将style="height: 300px;" 之类的内容添加到ngx-datatable 定义中。或者,您可以设置一个针对 .ngx-datatable 的规则,或者做一些更精细的操作,例如添加一个 id 属性并将其定位,然后添加一个样式来设置高度。

    以下是样式属性应用于您的 sn-p 时的样子。

    <ngx-datatable
        class="material"
        style="height: 300px;"
        [rows]="rows"
        [columns]="[{name:'Name'},{name:'Gender'},{name:'Company'}]"
        [columnMode]="'force'"
        [headerHeight]="50"
        [scrollbarV]="true"
        [footerHeight]="50"
        [rowHeight]="50"
        [externalPaging]="true"
        [count]="page.totalElements"
        [offset]="page.pageNumber"
        (page)='setPage($event)'>
    </ngx-datatable>
    

    【讨论】:

      【解决方案2】:

      我知道有点晚了,但是如果有人感兴趣,请指向您的 ngx-datatable 组件并从数据表中减去顶部组件的高度

      calc(100vh - 160px)
      

      【讨论】:

        【解决方案3】:

        这对我有用

        <ngx-datatable
                #table
                class="material common-m-tbl"
                [columns]="columnList"
                [columnMode]="ColumnMode.force"
                [virtualization]="false"
                [headerHeight]="50"
                [footerHeight]="footerHeight"
                rowHeight="36"
                [scrollbarV]="true"
                [rows]="rows"
                [messages]="messages"
                [externalPaging]="true"
                [count]="page.totalElements"
                [offset]="page.pageNumber"
                [limit]="page.size"
                (page)="setPage($event)"
                [selectionType]="SelectionType.single"
                (sort)="onSort($event)"
                (activate)="onActivate($event)"
                [messages]="messages"
                style="height: 530px;"
              >
        

        【讨论】: