Não é possível vincular a 'dataSource', pois não é uma propriedade conhecida de 'table'


86

Sou novo em desenvolvimento angular 5. Estou tentando desenvolver uma tabela de dados com material angular usando o exemplo fornecido aqui: " https://material.angular.io/components/table/examples ".

Estou recebendo um erro dizendo Can't bind to 'dataSource' since it isn't a known property of 'table'.

insira a descrição da imagem aqui

Por favor ajude.


4
Não é table, basta usar<mat-table #table [dataSource]...>
bugs de

1
tentei usar a tag mat-table, o erro desaparece, mas não vejo minha tabela na visualização.
Rahul Munjal

Essa é a maneira certa de usar o elemento, você deve ter outros problemas em outro lugar
bugs de

Você pode me fornecer um exemplo de trabalho usando mat-tabletag?
Rahul Munjal

8
O seletor que você está usando é da v6 e você instalou a v5. Você deve dar uma olhada nos exemplos da v5 v5.material.angular.io/components/table/examples
Jota.Toledo

Respostas:


117

Lembre-se de adicionar MatTableModuleseu app.module's importsie

Em Angular 9+

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

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

Menor que Angular 9

import { MatTableModule } from '@angular/material'  

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

4
Este funciona para mim, a maioria dos tutoriais usa a tag table e não a tag mat-table.
Phuah Yee Keat

1
Este também funciona para mim quando você usa a paginação, também temos que fazer a mesma coisa, eu acho
Aathil Ahamed

2
Eu tive que fazer import { MatTableModule } from '@angular/material/table'; funcionar
Chris Gunawardena

1
100% @WasiF se você obtiver um não é possível vincular com material angular, principalmente devido a um módulo não ter sido importado. A resposta acima tem meu apoio 100%.
Theodore

41

Obrigado @ Jota.Toledo, consegui a solução para a criação da minha mesa. Encontre o código de trabalho abaixo:

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 isso, posso fazer um componente de tabela reutilizável que leva a matriz de dados e a matriz de columnNames. Esta é uma solução muito melhor do que os exemplos em material.angular.io
Janne Harju

Tentei os mesmos passos, mas não ajuda.
Signcodeindie

@ Signcodeindie- Desculpe pela resposta tardia, Que erro você está recebendo?
Rahul Munjal

14
  • Angular Core v6.0.2,
  • Material angular, v6.0.2,
  • Angular CLI v6.0.0 (globalmente v6.1.2)

Tive esse problema durante a execução ng test, então, para corrigi-lo, adicionei ao meu xyz.component.spec.tsarquivo:

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

E adicionado à importsseção em TestBed.configureTestingModule({}):

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

O teste especifica a resposta aqui também. Resolvido para Angular 7.
SushiGuy

10

se você "importar {MatTableModule} de '@ angular / material';" está em um módulo compartilhado, certifique-se de exportá-lo.

sharedmodule.ts:

import { MatTableModule } from '@angular/material' 

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

em seguida, em seu módulo personalizado, onde você define o componente que usa a mesa de materiais:

custommodule.ts:

@NgModule({
imports: [ sharedmodule ]     
})

9

Para Angular 7

Verifique onde está localizado o seu componente de tabela. No meu caso, ele estava localizado como app / shared / tablecomponent onde a pasta compartilhada contém todos os subcomponentes. Mas eu estava importando o módulo de material em Ngmodules de app.module.ts que estava incorreto. Neste caso, o módulo de material deve ser importado em Ngmodules de shared.module.ts E funciona.

NÃO HÁ NECESSIDADE de alterar 'mesa' para 'mesa de tapete' no angular 7.

Angular7 - Não é possível vincular a 'dataSource', pois não é uma propriedade conhecida de 'mat-table'


4

O exemplo de material está usando as tags de tabela erradas. mudança

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

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

para

<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

Eu também estava quebrando minha cabeça por um longo tempo com esta mensagem de erro e depois identifiquei que estava usando [fonte de dados] em vez de [fonte de dados].


Obrigado por isso! Eu tive o mesmo problema com um conversor de pug online de: html-to-pug.com , ele copiou a entrada [dataSource] e converteu para [datasource]
Jonathan002

0

O problema é sua versão de material angular, tenho a mesma, e resolvi isso quando instalei a versão boa de material angular no local.

Espero que resolva o seu também.


-1

Lembre-se de importar o módulo MatTableModule e remover o elemento da tabela mostrado abaixo para referência.
implementação errada implementação
<table mat-table [dataSource]=”myDataArray”> ... </table>
correta:
<mat-table [dataSource]="myDataArray"> </mat-table>


-3

Por favor, veja que seu dataSource varibale não obtém os dados do servidor ou dataSource não está atribuído ao formato de dados esperado.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.