Impossibile eseguire il binding a "dataSource" poiché non è una proprietà nota di "table"


86

Sono nuovo nello sviluppo angolare 5. Sto cercando di sviluppare una tabella dati con materiale angolare utilizzando l'esempio fornito qui: " https://material.angular.io/components/table/examples ".

Ricevo un errore che dice Can't bind to 'dataSource' since it isn't a known property of 'table'.

inserisci qui la descrizione dell'immagine

Per favore aiuto.


4
Non è table, basta usare<mat-table #table [dataSource]...>
bug

1
ho provato a utilizzare il tag mat-table, quindi l'errore scompare ma non vedo la mia tabella nella vista.
Rahul Munjal

Questo è il modo giusto per utilizzare l'elemento, devi avere altri problemi da qualche altra parte
bug

Potete fornirmi un esempio funzionante utilizzando il mat-tabletag?
Rahul Munjal

8
Il selettore che stai utilizzando è della v6 e hai installato la v5. Dovresti dare un'occhiata agli esempi v5 v5.material.angular.io/components/table/examples
Jota.Toledo

Risposte:


117

Ricordati di aggiungere MatTableModulenel tuo app.module's importsie

In Angular 9+

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

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

Meno di angolare 9

import { MatTableModule } from '@angular/material'  

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

4
Questo funziona per me, la maggior parte dei tutorial usa il tag table e non il tag mat-table.
Phuah Yee Keat

1
Questo funziona anche per me quando usi l'impaginazione anche noi dobbiamo fare la stessa cosa, penso
Aathil Ahamed

2
Dovevo farlo import { MatTableModule } from '@angular/material/table'; funzionare
Chris Gunawardena

1
100% @WasiF se ottieni un impossibile legare con materiale angolare, principalmente a causa del mancato importazione di un modulo. La risposta di cui sopra ottiene il mio supporto al 100%.
Theodore

41

Grazie a @ Jota.Toledo, ho ricevuto la soluzione per la creazione del mio tavolo. Si prega di trovare il codice di lavoro di seguito:

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
Usando questo posso creare un componente tabella riutilizzabile che accetta array di dati e array di columnNames. Questa è una soluzione di gran lunga migliore rispetto agli esempi in material.angular.io
Janne Harju

Ho provato gli stessi passaggi ma non aiuta.
Signcodeindie

@ Signcodeindie- Ci scusiamo per la risposta così tardiva, che errore ricevi?
Rahul Munjal,

14
  • Angular Core v6.0.2,
  • Materiale angolare, v6.0.2,
  • CLI angolare v6.0.0 (globalmente v6.1.2)

Ho riscontrato questo problema durante l'esecuzione ng test, quindi per risolverlo ho aggiunto al mio xyz.component.spec.tsfile:

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

E l'ho aggiunto alla importssezione in TestBed.configureTestingModule({}):

beforeEach(async(() => {
    TestBed.configureTestingModule({
      imports: [ ReactiveFormsModule, HttpClientModule, RouterTestingModule, MatTableModule ],
      declarations: [ BookComponent ],
      schemas: [ CUSTOM_ELEMENTS_SCHEMA ]
    })
    .compileComponents();
}));

Anche qui il test specifica la risposta. Risolto per Angular 7.
SushiGuy

10

se il tuo "import {MatTableModule} da '@ angular / material';" si trova su un modulo condiviso, assicurati di esportarlo.

sharedmodule.ts:

import { MatTableModule } from '@angular/material' 

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

quindi sul modulo personalizzato dove definisci il componente che utilizza la tabella dei materiali:

custommunity.ts:

@NgModule({
imports: [ sharedmodule ]     
})

9

Per Angular 7

Controlla dove si trova il componente del tuo tavolo. Nel mio caso si trovava come app / shared / tablecomponent dove la cartella condivisa contiene tutti i componenti secondari Ma stavo importando il modulo materiale in Ngmodules di app.module.ts che non era corretto. In questo caso il modulo Material dovrebbe essere importato in Ngmodules di shared.module.ts E funziona.

Non è NECESSARIO cambiare 'table' in 'mat-table' nell'angolo 7.

Angular7 - Impossibile eseguire il binding a "dataSource" poiché non è una proprietà nota di "mat-table"


4

L'esempio materiale sta usando i tag di tabella sbagliati. Modificare

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

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

per

<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

Mi sono anche rotto la testa per molto tempo con questo messaggio di errore e in seguito ho scoperto che stavo usando [datasource] invece di [dataSource].


Grazie per questo! Ho avuto lo stesso problema con un convertitore pug online da: html-to-pug.com , ha copiato l' input [dataSource] e lo ha convertito in [datasource]
Jonathan002

0

Il problema è la tua versione del materiale angolare, io ho lo stesso, e ho risolto questo quando ho installato la buona versione del materiale angolare in locale.

Spero che risolva anche il tuo.


-1

Ricordarsi di importare il modulo MatTableModule e rimuovere l' elemento della tabella mostrato di seguito per riferimento.
implementazione errata implementazione
<table mat-table [dataSource]=”myDataArray”> ... </table>
corretta:
<mat-table [dataSource]="myDataArray"> </mat-table>


-3

Si prega di notare che la dataSource varibale non riceve i dati dal server o dataSource non è assegnata al formato di dati previsto.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.