0

I am using Angular Material and want to show a data table inside a custom modal and the data is not getting filled in, even not the header titles. Everything is empty.

Here is my History modal component:

import { Component, OnInit } from "@angular/core";

@Component({
  selector: "app-history",
  templateUrl: "./history.component.html",
  styleUrls: ["./history.component.scss"]
})
export class HistoryComponent implements OnInit {
  displayedColumns = ["position", "name", "weight", "symbol"];
  dataSource = ELEMENT_DATA;

  constructor() { }

  ngOnInit() {
  }

}

export interface Element {
  name: string;
  position: number;
  weight: number;
  symbol: string;
}
const ELEMENT_DATA: Element[] = [
  {position: 1, name: "Hydrogen", weight: 1.0079, symbol: "H"},
  {position: 2, name: "Helium", weight: 4.0026, symbol: "He"},
  {position: 3, name: "Lithium", weight: 6.941, symbol: "Li"},
  {position: 4, name: "Beryllium", weight: 9.0122, symbol: "Be"},
  {position: 5, name: "Boron", weight: 10.811, symbol: "B"},
  {position: 6, name: "Carbon", weight: 12.0107, symbol: "C"},
  {position: 7, name: "Nitrogen", weight: 14.0067, symbol: "N"},
  {position: 8, name: "Oxygen", weight: 15.9994, symbol: "O"},
  {position: 9, name: "Fluorine", weight: 18.9984, symbol: "F"},
  {position: 10, name: "Neon", weight: 20.1797, symbol: "Ne"},
  {position: 11, name: "Sodium", weight: 22.9897, symbol: "Na"},
  {position: 12, name: "Magnesium", weight: 24.305, symbol: "Mg"},
  {position: 13, name: "Aluminum", weight: 26.9815, symbol: "Al"},
  {position: 14, name: "Silicon", weight: 28.0855, symbol: "Si"},
  {position: 15, name: "Phosphorus", weight: 30.9738, symbol: "P"},
  {position: 16, name: "Sulfur", weight: 32.065, symbol: "S"},
  {position: 17, name: "Chlorine", weight: 35.453, symbol: "Cl"},
  {position: 18, name: "Argon", weight: 39.948, symbol: "Ar"},
  {position: 19, name: "Potassium", weight: 39.0983, symbol: "K"},
  {position: 20, name: "Calcium", weight: 40.078, symbol: "Ca"},
];
:host {
  display: flex;
}

.example-container {
  display: flex;
  flex-direction: column;
  min-width: 300px;
  overflow: auto;
  max-height: 500px;
}

.mat-header-cell.mat-sort-header-sorted {
  color: black;
}
<h2 mat-dialog-title>History</h2>
<!-- <mat-dialog-content class="example-container"> -->
  <div class="example-container">
    <mat-table #table [dataSource]="dataSource" matSort>

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

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

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

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

      <tr mat-header-row *matHeaderRowDef="displayedColumns"></tr>
      <tr mat-row *matRowDef="let row; columns: displayedColumns;"></tr>
    </mat-table>
  </div>
<!-- </mat-dialog-content> -->
<mat-dialog-actions>
  <button mat-button [mat-dialog-close]="true">OK</button>
</mat-dialog-actions>

Here is my Angular Material import module which I import into same module where I declare my HistoryComponent:

import { NgModule } from "@angular/core";

import {
  MatToolbarModule,
  MatButtonModule,
  MatButtonToggleModule,
  MatIconModule,
  MatCardModule,
  MatOptionModule,
  MatSelectModule,
  MatFormFieldModule,
  MatExpansionModule,
  MatListModule,
  MatCheckboxModule,
  MatSidenavModule,
  MatInputModule,
  MatDatepickerModule,
  MatNativeDateModule,
  MatDialogModule,
  MatTableModule,
  MatSortModule,
} from "@angular/material";

const materialModules = [
  MatToolbarModule,
  MatButtonModule,
  MatButtonToggleModule,
  MatIconModule,
  MatCardModule,
  MatOptionModule,
  MatSelectModule,
  MatFormFieldModule,
  MatExpansionModule,
  MatListModule,
  MatCheckboxModule,
  MatSidenavModule,
  MatInputModule,
  MatDatepickerModule,
  MatNativeDateModule,
  MatDialogModule,
  MatTableModule,
  MatSortModule,
];

@NgModule ({
  imports: [...materialModules],
  exports: [...materialModules],
})
export class MaterialModule { }

The HistoryComponent is declared and also added to the entryComponents array.

When I open the modal in the browser, no data is displayed in the table:

<mat-table _ngcontent-c19="" class="mat-table" matsort="" role="grid" ng-reflect-data-source="[object Object],[object Object">
<tr _ngcontent-c19="" mat-header-row="" class="ng-star-inserted" style=""></tr>
<tr _ngcontent-c19="" mat-row="" class="ng-star-inserted" style=""></tr>
<tr _ngcontent-c19="" mat-row="" class="ng-star-inserted" style=""></tr>
<tr _ngcontent-c19="" mat-row="" class="ng-star-inserted" style=""></tr>
<tr _ngcontent-c19="" mat-row="" class="ng-star-inserted" style=""></tr>
<tr _ngcontent-c19="" mat-row="" class="ng-star-inserted" style=""></tr>
<tr _ngcontent-c19="" mat-row="" class="ng-star-inserted" style=""></tr>
<tr _ngcontent-c19="" mat-row="" class="ng-star-inserted" style=""></tr>
<tr _ngcontent-c19="" mat-row="" class="ng-star-inserted" style=""></tr>
<tr _ngcontent-c19="" mat-row="" class="ng-star-inserted" style=""></tr>
<tr _ngcontent-c19="" mat-row="" class="ng-star-inserted" style=""></tr>
<tr _ngcontent-c19="" mat-row="" class="ng-star-inserted" style=""></tr>
<tr _ngcontent-c19="" mat-row="" class="ng-star-inserted" style=""></tr>
<tr _ngcontent-c19="" mat-row="" class="ng-star-inserted" style=""></tr>
<tr _ngcontent-c19="" mat-row="" class="ng-star-inserted" style=""></tr>
<tr _ngcontent-c19="" mat-row="" class="ng-star-inserted" style=""></tr>
<tr _ngcontent-c19="" mat-row="" class="ng-star-inserted" style=""></tr>
<tr _ngcontent-c19="" mat-row="" class="ng-star-inserted" style=""></tr>
<tr _ngcontent-c19="" mat-row="" class="ng-star-inserted" style=""></tr>
<tr _ngcontent-c19="" mat-row="" class="ng-star-inserted" style=""></tr>
<tr _ngcontent-c19="" mat-row="" class="ng-star-inserted" style=""></tr></mat-table>

What is hapenning here? I am not getting any errors or whatsoever.

StackBlitz example here: https://stackblitz.com/edit/angular-assyye but suddenly it is working there and I have no clue why.

4

1 Answer 1

2

The problem is the version upgrade which happened on 3.5.2018. They changed the mat-table-api heavily without mentioning it in the documentation.

  • Instead of <mat-table> it is <table mat-table> now.
  • Instead of <mat-header-cell> it is <th mat-header-cell> now.
  • Instead of <mat-cell> it is <td mat-cell> now.

Dear Angular Material team. Please add a shoutout to your documentation with breaking changes and such a big version upgrade from today to tomorrow. You get no notification anywhere and spending hours on it.

Not the answer you're looking for? Browse other questions tagged or ask your own question.