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.


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
    // ...
  ]
})

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,
],

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();
}));

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 ]     
})

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'


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>

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].


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.


-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>


-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.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.