Mat-form-field does not work

24,712

Solution 1

For me it's working fine. Did you import the following dependencies?

npm install --save @angular/material @angular/cdk
npm install --save @angular/animations

In your app.module.ts

import {BrowserAnimationsModule} from 
    '@angular/platform-browser/animations';
import { FormsModule } from '@angular/forms';
import { MatInputModule, MatTableModule, MatPaginatorModule, MatSortModule } 
from '@angular/material';

And remember to add a theme in your styles.css:

 @import "~@angular/material/prebuilt-themes/indigo-pink.css";

For Official Reference:
https://material.angular.io/guide/getting-started

Solution 2

I had the same issue. I was missing the MatInputModule. The FormsModule was unnecessary.

Strangely though, when I commented out the <mat-form-field> it would work but w/o the expected format which is expected.

Share:
24,712
Nonsense
Author by

Nonsense

Updated on June 11, 2021

Comments

  • Nonsense
    Nonsense about 3 years

    I make a table using Material Angular. Added sorting and pagination. But when I want to add a form for filtering everything gets off and in the end nothing works. What could I have done wrong? The component has been added to the project module.

    Before using the component Mat-form-field and after use.

    Here is an example of html and ts files:

    HTML:

    <div class="example-container mat-elevation-z8">
    
      <div class="example-header">
            <mat-form-field>
              <input matInput (keyup)="applyFilter($event.target.value)" placeholder="Filter">
            </mat-form-field>
          </div>
    
      <mat-table #table [dataSource]="dataSource" matSort>
    
        <!-- Position Column -->
        <ng-container matColumnDef="position">
          <mat-header-cell *matHeaderCellDef mat-sort-header> No. </mat-header-cell>
          <mat-cell *matCellDef="let element"> {{element.position}} </mat-cell>
        </ng-container>
    
        <!-- Name Column -->
        <ng-container matColumnDef="name">
          <mat-header-cell *matHeaderCellDef mat-sort-header> Name </mat-header-cell>
          <mat-cell *matCellDef="let element"> {{element.name}} </mat-cell>
        </ng-container>
    
        <!-- Weight Column -->
        <ng-container matColumnDef="weight">
          <mat-header-cell *matHeaderCellDef mat-sort-header> Weight </mat-header-cell>
          <mat-cell *matCellDef="let element"> {{element.weight}} </mat-cell>
        </ng-container>
    
        <!-- Symbol Column -->
        <ng-container matColumnDef="symbol">
          <mat-header-cell *matHeaderCellDef mat-sort-header> Symbol </mat-header-cell>
          <mat-cell *matCellDef="let element"> {{element.symbol}} </mat-cell>
        </ng-container>
    
        <mat-header-row *matHeaderRowDef="displayedColumns"></mat-header-row>
        <mat-row *matRowDef="let row; columns: displayedColumns;"></mat-row>
    
      </mat-table>
    
      <mat-paginator #paginator
                    [pageSize]="20"
                    [pageSizeOptions]="[5, 10, 20]"
                    [showFirstLastButtons]="true">
      </mat-paginator>
    
    </div>
    

    TS:

    import { Component, OnInit } from '@angular/core';
    import { ViewChild} from '@angular/core';
    import { MatTableDataSource, MatSort, MatPaginator } from '@angular/material';
    
    @Component({
      selector: 'app-home',
      templateUrl: './home.component.html',
      styleUrls: ['./home.component.scss']
    })
    export class HomeComponent implements OnInit {
      displayedColumns = ['position', 'name', 'weight', 'symbol'];
      dataSource = new MatTableDataSource(ELEMENT_DATA);
    
      @ViewChild(MatSort) sort: MatSort;
      @ViewChild(MatPaginator) paginator: MatPaginator;
    
      applyFilter(filterValue: string) {
        filterValue = filterValue.trim(); // Remove whitespace
        filterValue = filterValue.toLowerCase(); // MatTableDataSource defaults to lowercase matches
        this.dataSource.filter = filterValue;
      }
    
      ngAfterViewInit() {
        this.dataSource.sort = this.sort;
        this.dataSource.paginator = this.paginator;
      }
    
      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'},
      ];
    
  • Juliano Vargas
    Juliano Vargas over 2 years
    Have issue here with CSS not applying there is no mention in the doc for @import ~@angular/material/prebuilt-themes/indigo-pink.css; or any themes if you choose a built in I thought it would modify and add the import but doesn't look like this is the case.
  • Juan
    Juan over 2 years
    It seems like the way to apply pre-built css has changed in the newer versions. Check this link in the documentation for Angular Material version 13.2.1 material.angular.io/guide/theming#using-a-pre-built-theme Specifically: "You can find the pre-built theme files in the "prebuilt-themes" directory of Angular Material's npm package (@angular/material/prebuilt-themes). To include the pre-built theme in your application, add your chosen CSS file to the styles array of your project's angular.json file"
  • Jorge Guerra Pires
    Jorge Guerra Pires almost 2 years
    In my case, it was just the css import. I never had to do it, not sure why now. Do remember needing to manually add the import of css. Thanks 🤗