具有多个页脚的 mat-table

Posted

技术标签:

【中文标题】具有多个页脚的 mat-table【英文标题】:mat-table with multiple footers 【发布时间】:2020-01-25 20:23:02 【问题描述】:

我想创建以下内容:一个带有一些额外页脚行的表,这些行没有专门绑定到mat-tabledataSource,而是绑定到组件中的其他一些数据源。 我应该指定我不需要它们是多个页脚(因为我找不到好的方法来实现这一点),但我只需要最后 3 个响应。

我们的数据模型如下所示:


   // These contain the info for the last 3 rows (netto bedrag, BTW, Totaalbedrag)
   netAmount: number;
   vatAmount: number; 
   totalAmount: number;
   lines: // lines is our data source
   [
     
        // These are the columns (Omschrijving, Tarief, Aantal, totaal)
        description: string;
        unitPrice: number;
        quantity: number;
        total: number;
     
   ];

我们的 html 看起来像这样,为了便于阅读,我省略了 CSS,但我确实需要分隔符!

<div class="purchase-invoices__lines">
  <mat-table #table [dataSource]="dataSource">
    <ng-container matColumnDef="description">
      <mat-header-cell *matHeaderCellDef>Omschrijving</mat-header-cell>
      <mat-cell *matCellDef="let invoiceLine">
        <span class="mobile-label">Omschrijving:</span>
        <span class="mobile-value">  invoiceLine.description  </span>
      </mat-cell>
      <mat-footer-cell *matFooterCellDef>
        <span class="mobile-value net-amount_text ">
          Netto Bedrag
        </span>
      </mat-footer-cell>
    </ng-container>

    <ng-container matColumnDef="tariff">
      <mat-header-cell *matHeaderCellDef>Tarief</mat-header-cell>
      <mat-cell *matCellDef="let invoiceLine">
        <span class="mobile-label">Tarief:</span>
        <span class="mobile-value">  invoiceLine.unitPrice | currency: 'EUR' </span> </mat-cell
      ><mat-footer-cell *matFooterCellDef></mat-footer-cell>
    </ng-container>

    <ng-container matColumnDef="amount">
      <mat-header-cell *matHeaderCellDef>Aantal</mat-header-cell>
      <mat-cell *matCellDef="let invoiceLine">
        <span class="mobile-label">Aantal:</span>
        <span class="mobile-value">  invoiceLine.quantity </span>
      </mat-cell>
      <mat-footer-cell *matFooterCellDef></mat-footer-cell>
    </ng-container>

    <ng-container matColumnDef="total">
      <mat-header-cell *matHeaderCellDef>Totaal</mat-header-cell>
      <mat-cell *matCellDef="let invoiceLine">
        <span class="mobile-label">Totaal:</span>
        <span class="mobile-value">  invoiceLine.totalPrice | currency: 'EUR' </span>
      </mat-cell>
      <mat-footer-cell *matFooterCellDef>
        <span class="mobile-value">  purchaseInvoice.netAmount | currency: 'EUR'  </span>
      </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="displayedColumns"></mat-footer-row>
  </mat-table>
</div>

到目前为止,我的结果如下所示:

你们知道我将如何创建我的预期结果吗?正如您在标题中看到的那样,我的第一个想法是有多个页脚,但我不知道这是否可能。我找到了this example,但我无法让它像我的示例中那样工作。

我自己就是一个后端,无法创建一个很好的例子或解释为什么事情不起作用,所以我祈祷你们能神奇地解决我的问题。

非常感谢!

【问题讨论】:

【参考方案1】:

我修复它的方式:

在 TS 中:

  displayedColumns = ['description', 'tariff', 'amount', 'total'];
  displayedVatColumns = ['vatAmountTitle', 'emptyFooter', 'emptyFooter', 'vatAmount'];
  displayedTotalColumns = ['totalAmountTitle', 'emptyFooter', 'emptyFooter', 'totalAmount'];

在 HTML 中:

<div class="purchase-invoices__lines">
  <mat-table #table [dataSource]="purchaseInvoice.invoiceLines">
    <ng-container matColumnDef="description">
      <mat-header-cell *matHeaderCellDef>Omschrijving</mat-header-cell>
      <mat-cell *matCellDef="let invoiceLine">
        <span class="mobile-label">Omschrijving:</span>
        <span class="mobile-value">  invoiceLine.description  </span>
      </mat-cell>
      <mat-footer-cell *matFooterCellDef class="bold mobile-hide"><span class="mobile-value">Netto Bedrag</span></mat-footer-cell>
    </ng-container>

    <ng-container matColumnDef="tariff">
      <mat-header-cell *matHeaderCellDef>Tarief</mat-header-cell>
      <mat-cell *matCellDef="let invoiceLine">
        <span class="mobile-label">Tarief:</span>
        <span class="mobile-value">  invoiceLine.unitPrice | currency: 'EUR' </span>
      </mat-cell>
      <mat-footer-cell *matFooterCellDef class="mobile-hide"></mat-footer-cell>
    </ng-container>

    <ng-container matColumnDef="amount">
      <mat-header-cell *matHeaderCellDef>Aantal</mat-header-cell>
      <mat-cell *matCellDef="let invoiceLine">
        <span class="mobile-label">Aantal:</span>
        <span class="mobile-value">  invoiceLine.quantity </span>
      </mat-cell>
      <mat-footer-cell *matFooterCellDef class="mobile-hide"></mat-footer-cell>
    </ng-container>

    <ng-container matColumnDef="total">
      <mat-header-cell *matHeaderCellDef>Totaal</mat-header-cell>
      <mat-cell *matCellDef="let invoiceLine">
        <span class="mobile-label">Totaal:</span>
        <span class="mobile-value">  invoiceLine.netPrice | currency: 'EUR' </span>
      </mat-cell>
      <mat-footer-cell *matFooterCellDef>
        <span class="mobile-label bold">Netto Bedrag</span>
        <span class="mobile-value bold">  purchaseInvoice.netAmount | currency: 'EUR' </span>
      </mat-footer-cell>
    </ng-container>

    <!-- empty footer row-->
    <ng-container matColumnDef="emptyFooter">
      <mat-footer-cell *matFooterCellDef class="mobile-hide"></mat-footer-cell>
    </ng-container>

    <!-- set footer for vat amount-->
    <ng-container matColumnDef="vatAmountTitle">
      <mat-footer-cell *matFooterCellDef class="mobile-hide">BTW (21%)</mat-footer-cell>
    </ng-container>

    <ng-container matColumnDef="vatAmount">
      <mat-footer-cell *matFooterCellDef>
        <span class="mobile-label">BTW (21%)</span>
        <span class="mobile-value">  purchaseInvoice.vatAmount | currency: 'EUR' </span>
      </mat-footer-cell>
    </ng-container>

    <!-- set footer for total amount-->
    <ng-container matColumnDef="totalAmountTitle">
      <mat-footer-cell *matFooterCellDef class="mobile-hide bold">Totaalbedrag</mat-footer-cell>
    </ng-container>

    <ng-container matColumnDef="totalAmount">
      <mat-footer-cell *matFooterCellDef>
        <span class="mobile-label bold">Totaalbedrag</span>
        <span class="mobile-value bold">  purchaseInvoice.totalAmount | currency: 'EUR' </span>
      </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="displayedColumns" class="nettoRow"></mat-footer-row>
    <mat-footer-row *matFooterRowDef="displayedVatColumns" class="vatRow"></mat-footer-row>
    <mat-footer-row *matFooterRowDef="displayedTotalColumns" class="totalRow"></mat-footer-row>
  </mat-table>
</div>

我希望这对人们有所帮助!

【讨论】:

【参考方案2】:

好的,让我试试这个。我正在寻找一种解决方案,将我的分页器放在表格中,并遇到了您的问题。所以,我不确定这是否是最好的解决方案,但它可以工作。如果您不需要页脚来引用这些列(或者即使您需要多个页脚),您可以为您的页脚添加多个 ng-container。与您可能拥有的示例类似

  <ng-container matColumnDef="netto">
    <td mat-footer-cell *matFooterCellDef>
      Netto Bedrag
    </td>
  </ng-container>

  <ng-container matColumnDef="blankCell">
    <td mat-footer-cell *matFooterCellDef>
    </td>
  </ng-container>

  <ng-container matColumnDef="total">
    <td mat-footer-cell *matFooterCellDef>
      purchaseInvoice.netAmount | currency: 'EUR' 
    </td>
  </ng-container>

然后在底部使用这些新单元格创建一个新的 mat-footer-row。您可以根据需要多次重复使用 blankCell。

<tr mat-footer-row
  *matFooterRowDef="['netto', 'blankCell', 'blankCell', 'total']; sticky: true">
</tr>

只需为您需要的每个页脚重复(对您需要的任何空白单元格重复使用 blankCell)。该顺序将基于您的 matColumnDef 名称数组。由于您已经拥有 Netto Bedrag 的,您可以跳过它并用您需要的替换它(BTW 和 Totaalbedrag)。可能有一个更清洁的解决方案,但这至少会让你接近。

【讨论】:

嗨!很抱歉,我忘记将我的问题标记为已回答;我前段时间修好了。很抱歉浪费了您的时间,但我希望它可以在某个时候对其他人有所帮助。我会尽量记住在这里发布我的解决方案:)

以上是关于具有多个页脚的 mat-table的主要内容,如果未能解决你的问题,请参考以下文章

MS Word VBA 链接多个部分和页面的上一个页脚

无论如何创建一个带有一个通用页脚的 UITableView 吗?

具有固定页眉、第一列和页脚的表格 + 向内滚动

如何将 DiffUtil.Callback 与具有页眉和页脚的 RecyclerView 一起使用?

如何在 MapControl 中动态使用具有多个引脚的多个自定义弹出窗口

在iOS7中具有固定页眉和页脚的网页上的滚动问题