Impossible de se lier à 'dataSource' car ce n'est pas une propriété connue de 'table'

86

Je suis nouveau dans le développement angulaire 5. J'essaie de développer une table de données avec un matériau angulaire en utilisant l'exemple fourni ici: " https://material.angular.io/components/table/examples ".

Je reçois une erreur en disant Can't bind to 'dataSource' since it isn't a known property of 'table'.

entrez la description de l'image ici

Veuillez aider.

Rahul Munjal
la source
4
Ce n'est pas table, juste utiliser<mat-table #table [dataSource]...>
bugs
1
essayé d'utiliser la balise mat-table, puis l'erreur disparaît mais je ne vois pas ma table dans la vue.
Rahul Munjal
C'est la bonne façon d'utiliser l'élément, vous devez avoir d'autres problèmes ailleurs
bugs
Pouvez-vous me fournir un exemple de travail utilisant la mat-tablebalise?
Rahul Munjal
8
Le sélecteur que vous utilisez provient de la v6 et vous avez installé la v5. Vous devriez jeter un coup d'œil aux exemples v5 v5.material.angular.io/components/table/examples
Jota.Toledo

Réponses:

117

N'oubliez pas d'ajouter MatTableModulevotre app.module's importsie

Dans Angular 9+

import { MatTableModule } from '@angular/material/table'  

@NgModule({
  imports: [
    // ...
    MatTableModule
    // ...
  ]
})

Moins angulaire 9

import { MatTableModule } from '@angular/material'  

@NgModule({
  imports: [
    // ...
    MatTableModule
    // ...
  ]
})
WasiF
la source
4
Celui-ci fonctionne pour moi, la plupart des tutoriels utilisent la balise table et non la balise mat-table.
Phuah Yee Keat
1
Celui-ci fonctionne aussi pour moi lorsque vous utilisez la pagination, nous devons également faire la même chose, je pense
Aathil Ahamed
2
Je devais le faire import { MatTableModule } from '@angular/material/table'; travailler
Chris Gunawardena
1
100% @WasiF si vous obtenez un ne peut pas se lier avec un matériau angulaire, principalement à cause d'un module non importé. La réponse ci-dessus obtient mon soutien à 100%.
Theodore le
41

Merci à @ Jota.Toledo, j'ai eu la solution pour ma création de table. Veuillez trouver le code de travail ci-dessous:

component.html

<mat-table #table [dataSource]="dataSource" matSort>
  <ng-container matColumnDef="{{column.id}}" *ngFor="let column of columnNames">
    <mat-header-cell *matHeaderCellDef mat-sort-header> {{column.value}}</mat-header-cell>
    <mat-cell *matCellDef="let element"> {{element[column.id]}}</mat-cell>
  </ng-container>

  <mat-header-row *matHeaderRowDef="displayedColumns"></mat-header-row>
  <mat-row *matRowDef="let row; columns: displayedColumns;"></mat-row>
</mat-table>

component.ts

import { Component, OnInit, ViewChild } from '@angular/core';
import { MatTableDataSource, MatSort } from '@angular/material';
import { DataSource } from '@angular/cdk/table';

@Component({
  selector: 'app-m',
  templateUrl: './m.component.html',
  styleUrls: ['./m.component.css'],
})
export class MComponent implements OnInit {

  dataSource;
  displayedColumns = [];
  @ViewChild(MatSort) sort: MatSort;

  /**
   * Pre-defined columns list for user table
   */
  columnNames = [{
    id: 'position',
    value: 'No.',

  }, {
    id: 'name',
    value: 'Name',
  },
    {
      id: 'weight',
      value: 'Weight',
    },
    {
      id: 'symbol',
      value: 'Symbol',
    }];

  ngOnInit() {
    this.displayedColumns = this.columnNames.map(x => x.id);
    this.createTable();
  }

  createTable() {
    let tableArr: 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' },
    ];
    this.dataSource = new MatTableDataSource(tableArr);
    this.dataSource.sort = this.sort;
  }
}

export interface Element {
  position: number,
  name: string,
  weight: number,
  symbol: string
}

app.module.ts

imports: [
  MatSortModule,
  MatTableModule,
],
Rahul Munjal
la source
2
En utilisant cela, je peux créer un composant de table réutilisable qui prend un tableau de données et un tableau columnNames. C'est une bien meilleure solution que les exemples de material.angular.io
Janne Harju
J'ai essayé les mêmes étapes mais cela n'aide pas.
Signcodeindie
@ Signcodeindie- Désolé pour la réponse si tardive, quelle erreur obtenez-vous?
Rahul Munjal
14
  • Angular Core v6.0.2,
  • Matériau angulaire, v6.0.2,
  • CLI angulaire v6.0.0 (globalement v6.1.2)

J'ai eu ce problème lors de l'exécution ng test, donc pour le résoudre, j'ai ajouté à mon xyz.component.spec.tsfichier:

import { MatTableModule } from '@angular/material';

Et l'a ajouté à la importssection dans TestBed.configureTestingModule({}):

beforeEach(async(() => {
    TestBed.configureTestingModule({
      imports: [ ReactiveFormsModule, HttpClientModule, RouterTestingModule, MatTableModule ],
      declarations: [ BookComponent ],
      schemas: [ CUSTOM_ELEMENTS_SCHEMA ]
    })
    .compileComponents();
}));
Andrii Lundiak
la source
Test spécifie la réponse ici aussi. Résolu pour Angular 7.
SushiGuy
10

si votre "import {MatTableModule} de '@ angular / material';" est sur un module partagé, assurez-vous de l'exporter.

sharedmodule.ts:

import { MatTableModule } from '@angular/material' 

@NgModule({
  imports: [
    // ...
    MatTableModule
    // ...
  ],
  exports:[ MatTableModule ]
})

puis sur votre module personnalisé où vous définissez le composant utilisant la table des matières:

custommodule.ts:

@NgModule({
imports: [ sharedmodule ]     
})
Le_Rub
la source
9

Pour Angular 7

Vérifiez où se trouve votre composant de table. Dans mon cas, il était situé comme app / shared / tablecomponent où le dossier partagé contient tous les sous-composants Mais j'importais un module de matériel dans Ngmodules de app.module.ts, ce qui était incorrect. Dans ce cas, le module Material doit être importé dans Ngmodules de shared.module.ts Et cela fonctionne.

Il n'y a PAS BESOIN de changer 'table' en 'mat-table' dans angulaire 7.

Angular7 - Impossible de se lier à 'dataSource' car ce n'est pas une propriété connue de 'mat-table'

Sanchit
la source
4

L'exemple matériel utilise les mauvaises balises de table. Changement

<table mat-table></table>
<th mat-header-cell></th>
<td mat-cell></td>

<tr mat-header-row></tr>
<tr mat-row></tr>

à

<mat-table></mat-table>
<mat-header-cell></mat-header-cell>
<mat-cell></mat-cell>

<mat-header-row></<mat-header-row>
<mat-row></<mat-row>
Itzhar
la source
1

Je me suis aussi cassé la tête pendant longtemps avec ce message d'erreur et plus tard j'ai identifié que j'utilisais [datasource] au lieu de [dataSource].

Balasubramanien S
la source
Merci pour cela! J'ai eu le même problème avec un convertisseur carlin en ligne à partir de: html-to-pug.com , il a copié l' entrée [dataSource] et l'a convertie en [datasource]
Jonathan002
0

Le problème est votre version de matériau angulaire, j'ai la même chose, et je l'ai résolu lorsque j'ai installé la bonne version de matériau angulaire en local.

J'espère que cela résoudra le vôtre aussi.

Andresse Njeungoue
la source
-1

N'oubliez pas d'importer le module MatTableModule et de supprimer l' élément de table ci-dessous pour référence.
mauvaise mise en
<table mat-table [dataSource]=”myDataArray”> ... </table>
œuvre mise en œuvre correcte:
<mat-table [dataSource]="myDataArray"> </mat-table>

Yogesh Aggarwal
la source
-3

Veuillez voir que votre variable dataSource n'obtient pas les données du serveur ou dataSource n'est pas affectée au format de données attendu.

Omkar Jadhav
la source