Неможливо прив’язати до 'dataSource', оскільки це не відома властивість 'table'


86

Я новачок у кутовій розробці 5. Я намагаюся розробити таблицю даних з кутовим матеріалом, використовуючи приклад, наведений тут: " https://material.angular.io/components/table/examples ".

Я отримую повідомлення про помилку Can't bind to 'dataSource' since it isn't a known property of 'table'.

введіть тут опис зображення

Будь ласка, допоможіть.


4
Це не так table, просто використовуйте<mat-table #table [dataSource]...>
помилки

1
спробував використати тег mat-table, тоді помилка зникає, але я не бачу свою таблицю у поданні.
Рахул Мунджал,

Це правильний спосіб використання елемента, у вас повинні бути інші проблеми десь ще
помилки

Чи можете ви надати мені робочий приклад за допомогою mat-tableтегу?
Рахул Мунджал,

8
Селектор, який ви використовуєте, знаходиться з v6, і ви встановили v5. Вам слід поглянути на приклади v5 v5.material.angular.io/components/table/examples
Jota.Toledo

Відповіді:


117

Не забудьте додати MatTableModuleу ваш app.module's importsie

У Angular 9+

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

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

Менше, ніж кутовий 9

import { MatTableModule } from '@angular/material'  

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

4
Це працює для мене, більшість підручників використовують тег таблиці, а не тег мат-таблиці.
Phuah Yee Keat

1
Це працює і для мене, коли ви використовуєте пагінацію. Також нам потрібно робити те саме, я думаю
Aathil Ahamed

2
Мені довелося змусити import { MatTableModule } from '@angular/material/table'; працювати
Кріс Гунавардена,

1
100% @WasiF, якщо ви отримуєте неможливий зв'язок з кутовим матеріалом, це здебільшого через не імпорт модуля. Наведена вище відповідь отримує мою 100% підтримку.
Теодор

41

Подякуючи @ Jota.Toledo, я отримав рішення для створення своєї таблиці. Будь ласка, знайдіть робочий код нижче:

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>

компонент.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
Використовуючи це, я можу зробити багаторазовий компонент таблиці, який приймає масив даних та масив columnNames. Це набагато краще рішення, ніж приклади в material.angular.io
Janne Harju

Пробував ті самі кроки, але не допомагає.
Signcodeindie

@ Signcodeindie - Вибачте за пізню відповідь, яку помилку ви отримуєте?
Рахул Мунджал

14
  • Angular Core v6.0.2,
  • Кутовий матеріал, v6.0.2,
  • Кутовий CLI v6.0.0 (глобально v6.1.2)

У мене виникла ця проблема під час запуску ng test, тому, щоб виправити її, я додав до свого xyz.component.spec.tsфайлу:

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

І додав його до importsрозділу в TestBed.configureTestingModule({}):

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

Тестування специфікації відповіді тут також. Вирішено для Angular 7.
SushiGuy

10

якщо ваш "імпортувати {MatTableModule} з '@ angular / material';" знаходиться на спільному модулі, обов’язково експортуйте його.

sharedmodule.ts:

import { MatTableModule } from '@angular/material' 

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

потім у своєму користувацькому модулі, де ви визначаєте компонент, який використовує таблицю матеріалів:

custommodule.ts:

@NgModule({
imports: [ sharedmodule ]     
})

9

Для кутових 7

Перевірте, де знаходиться ваш компонент таблиці. У моєму випадку він знаходився як app / shared / tablecomponent, де спільна папка містить усі підкомпоненти, але я імпортував модуль матеріалу в Ngmodules app.module.ts, що було неправильно. У цьому випадку модуль Material слід імпортувати в Ngmodules shared.module.ts І він працює.

У кутовій 7 немає необхідності змінювати "стіл" на "килимок".

Angular7 - Неможливо прив’язати до 'dataSource', оскільки це не відома властивість 'mat-table'


4

Прикладом матеріалу є використання неправильних тегів таблиці. Зміна

<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

Я також довго ламав голову цим повідомленням про помилку, а згодом виявив, що використовую [datasource] замість [dataSource].


Дякую за це! У мене була та ж проблема з мопсовим перетворювачем в Інтернеті з: html-to-pug.com , він скопіював вхід [dataSource] і перетворив його на [datasource]
Jonathan002,

0

Проблема полягає у вашій версії кутового матеріалу, у мене така сама, і я вирішив це, коли встановив хорошу версію кутового матеріалу в локальну версію.

Сподіваюся, це вирішить і ваше.


-1

Не забудьте імпортувати модуль MatTableModule і видалити елемент таблиці, показаний нижче, для довідки.
неправильна реалізація
<table mat-table [dataSource]=”myDataArray”> ... </table>
правильна реалізація:
<mat-table [dataSource]="myDataArray"> </mat-table>


-3

Будь ласка, зверніть увагу, що ваша версія dataSource не отримує дані із сервера, або dataSource не присвоєно очікуваному формату даних.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.