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.

Rahul Munjal
fonte
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
    // ...
  ]
})
WasiF
fonte
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,
],
Rahul Munjal
fonte
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();
}));
Andrii Lundiak
fonte
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 ]     
})
The_Rub
fonte
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'

Sanchit
fonte
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>
itzhar
fonte
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].

Balasubramanian S
fonte
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.

Andresse Njeungoue
fonte
-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>

Yogesh Aggarwal
fonte
-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.

Omkar Jadhav
fonte