Пагинатор не работает должным образом с источником данных таблицы, используя угловой материал для приложения angular 2

Я пытаюсь реализовать таблицу в своем приложении angular 2 с компонентом paginator.

Я успешно могу создать таблицу, используя компонент таблицы в angular 2, но я сделал это, используя приведенный ниже оператор импорта.

"импортировать {DataSource} из '@ angular / cdk / collections';"

Ниже показан мой home.component.ts

import { Component , OnInit , ViewChild} from '@angular/core';
import { Observable } from 'rxjs/Observable';
import { DataSource } from '@angular/cdk/collections';
import { MatPaginator } from '@angular/material';

@Component({
  selector: 'app-home',
  templateUrl: './home.component.html',
   styleUrls: ['./home.component.scss']
})


export class HomeComponent  implements OnInit {


 @ViewChild(MatPaginator) paginator: MatPaginator;

    ngAfterViewInit() {
    this.dataSource.paginator = this.paginator;
  }


displayedColumns = ['num', 'message'];

  dataSource: eDataSource;

  ELEMENT_DATA: Element[] = [

  {num: 1, message: 'Message 1 '},
  {num: 2, message: 'Message 2 '},
  {num: 3, message: 'Message 3 '},
  {num: 4, message: 'Message 4 '},
  {num: 5, message: 'Message 5 '},
  {num: 6, message: 'Message 6 '},
  {num: 7, message: 'Message 7 '},
  {num: 8, message: 'Message 8 '},
  {num: 9, message: 'Message 9 '},
  {num: 10, message: 'Message 10 '},
  {num: 11, message: 'Message 11 '},
  {num: 12, message: 'Message 12 '},
  {num: 13, message: 'Message 13 '},
  {num: 14, message: 'Message 14 '},
  {num: 15, message: 'Message 15 '},
  {num: 16, message: 'Message 16 '},
  {num: 17, message: 'Message 17 '},
  {num: 18, message: 'Message 18 '},
  {num: 19, message: 'Message 19 '},
  {num: 20, message: 'Message 20'},

  ];

  ngOnInit() {
    this.dataSource = new eDataSource(this.ELEMENT_DATA);
  }
}

export interface Element {
    num: number;
    message: string;
  }

export class eDataSource extends DataSource<any> {

  constructor(private element: Element[]) {
    super();
  }

  connect(): Observable<Element[]> {
    return Observable.of(this.element);
  }

  disconnect() {}
}

Ниже показан мой home.component.html

<mat-card class="styletable">
<div class="example-container mat-elevation-z8">
 <mat-table #table [dataSource]="dataSource">
<ng-container matColumnDef="num" >
  <mat-header-cell style="max-width: 100px;" *matHeaderCellDef> No. </mat-header-cell>
  <mat-cell style="max-width: 100px;" *matCellDef="let element"> {{element.num}} </mat-cell>
</ng-container>

<!-- Name Column -->
<ng-container matColumnDef="message">
  <mat-header-cell *matHeaderCellDef> Message </mat-header-cell>
  <mat-cell style="text-align: left;" *matCellDef="let element"> {{element.message}} </mat-cell>
</ng-container>

<mat-header-row *matHeaderRowDef="displayedColumns"></mat-header-row>
<mat-row *matRowDef="let row; columns: displayedColumns;"></mat-row>
</mat-table>


 <mat-paginator #paginator
              [pageSize]="10"
              [pageSizeOptions]="[ 5, 10, 25, 100 ]">
</mat-paginator>
</div>
</mat-card>

Используя приведенный выше код, я получаю следующую ошибку в моем cli

«D: /Angular/loginmat/src/app/home/home.component.ts (20,21): свойство 'paginator' не существует для типа 'eDataSource'».

Может ли кто-нибудь помочь мне понять, чего мне не хватает для реализации пагинатора с моей таблицей?


person Heena    schedule 16.01.2018    source источник
comment
Вы импортируете MatPaginatorModule и MatTableModule в свой модуль приложения?   -  person Jesse Hautala    schedule 10.03.2018
comment
Если вы отметите DataSource<T>, вы увидите, что в отличие от MatTableDataSource<T> он не содержит свойства 'paginator'. Если вы хотите использовать пагинатор из коробки, я полагаю, вам следует использовать MatTableDataSource   -  person Bart de Ruijter    schedule 15.03.2018
comment
да, у меня есть решение для этого ........   -  person Heena    schedule 17.03.2018


Ответы (1)


Чтобы установить DataSource, вы должны использовать MatTableDataSource. Он содержит свойство paginator.

Вот фиксированная версия файла TS:

import { Component, OnInit, ViewChild, AfterViewInit } from '@angular/core';
import { MatPaginator, MatTableDataSource } from '@angular/material';

@Component({
  selector: 'app-home',
  templateUrl: './home-component.component.html',
  styleUrls: ['./home-component.component.css']
})

export class HomeComponent implements OnInit {

  @ViewChild(MatPaginator) paginator: MatPaginator;
  @ViewChild(MatPaginator) dataSource: MatTableDataSource<Element>;

  displayedColumns = ['num', 'message'];

  ngOnInit() {
    this.dataSource = new MatTableDataSource(ELEMENT_DATA);
    this.dataSource.paginator = this.paginator;
  }
}

const ELEMENT_DATA: Element[] = [
  { num: 1, message: 'Message 1 ' },
  { num: 2, message: 'Message 2 ' },
  { num: 3, message: 'Message 3 ' },
  { num: 4, message: 'Message 4 ' },
  { num: 5, message: 'Message 5 ' },
  { num: 6, message: 'Message 6 ' },
  { num: 7, message: 'Message 7 ' },
  { num: 8, message: 'Message 8 ' },
  { num: 9, message: 'Message 9 ' },
  { num: 10, message: 'Message 10 ' },
  { num: 11, message: 'Message 11 ' },
  { num: 12, message: 'Message 12 ' },
  { num: 13, message: 'Message 13 ' },
  { num: 14, message: 'Message 14 ' },
  { num: 15, message: 'Message 15 ' },
  { num: 16, message: 'Message 16 ' },
  { num: 17, message: 'Message 17 ' },
  { num: 18, message: 'Message 18 ' },
  { num: 19, message: 'Message 19 ' },
  { num: 20, message: 'Message 20' },
];

export interface Element {
  num: number;
  message: string;
}
person Tomasz Chudzik    schedule 01.08.2018