У меня была таблица с работающей фильтрацией и рабочим пагинатором. Это код, который у меня был:
user.component.ts
import { Component, OnInit, ViewChild } from '@angular/core';
import { MatPaginator } from '@angular/material/paginator';
import { MatTableDataSource } from '@angular/material/table';
export interface User {
userName: string;
companyId: number;
}
const ELEMENT_DATA: myUsers[] = [
{
userName: 'bla bla',
companyId: 1,
},
{
userName: 'test test',
companyId: 25,
},
];
/**
* @title Table with sticky header, filtering and pagination
*/
@Component({
selector: 'app-user',
styleUrls: ['user.component.css'],
templateUrl: 'user.component.html',
})
export class UserComponent implements OnInit {
displayedColumns: string[] = ['userName', 'companyId'];
dataSource = new MatTableDataSource<myUsers>(ELEMENT_DATA);
@ViewChild(MatPaginator, { static: true }) paginator: MatPaginator;
ngOnInit() {
this.dataSource.paginator = this.paginator;
}
public applyFilter = (value: string) => {
this.dataSource.filter = value.trim().toLowerCase();
};
}
user.component. html
<div>
<mat-form-field>
<mat-label>Filter</mat-label>
<input matInput type="text" (keyup)="applyFilter($event.target.value)" placeholder="Filter" />
</mat-form-field>
</div>
<div mat-elevation-z8">
<table mat-table [dataSource]="dataSource">
<!-- userName Column -->
<ng-container matColumnDef="userName ">
<th mat-header-cell *matHeaderCellDef>userName </th>
<td mat-cell *matCellDef="let element">{{ element.userName }}</td>
</ng-container>
<!-- companyId Column -->
<ng-container matColumnDef="companyId ">
<th mat-header-cell *matHeaderCellDef>companyId </th>
<td mat-cell *matCellDef="let element">{{ element.companyId }}</td>
</ng-container>
<tr mat-header-row *matHeaderRowDef="displayedColumns; sticky: true"></tr>
<tr mat-row *matRowDef="let row; columns: displayedColumns"></tr>
</table>
<mat-paginator [pageSize]="10" [pageSizeOptions]="[5, 10, 20]" showFirstLastButtons> </mat-paginator>
</div>
user.component. css
table {
width: 100%;
}
, который отлично работает. Я хотел перейти к поддельному API, поэтому я последовал этому руководству и получил следующий код:
user.model.ts
export interface User {
userName: string;
companyId: number;
}
user.service .ts
import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { Observable, of } from 'rxjs';
import { map } from 'rxjs/operators';
import { User } from '../models/user.model';
@Injectable()
export class UserService {
private serviceUrl = 'someFunctioningLinkWithJsonData';
constructor(private http: HttpClient) { }
getUser(): Observable<User[]> {
return this.http.get<User[]>(this.serviceUrl);
}
}
и, наконец, user.component.ts стал:
import { Component, OnInit } from '@angular/core';
import { UserService } from '../../services/user.service';
import { Observable, of } from 'rxjs';
import {DataSource} from '@angular/cdk/collections';
import { User } from '../../models/user.model';
@Component({
selector: 'app-user',
templateUrl: './user.component.html',
styleUrls: ['./user.component.css']
})
export class UserComponent implements OnInit {
dataSource = new UserDataSource(this.userService);
displayedColumns = ['userName', 'companyId'];
constructor(private userService: UserService) { }
ngOnInit() {
}
}
export class UserDataSource extends DataSource<any> {
constructor(private userService: UserService) {
super();
}
connect(): Observable<User[]> {
return this.userService.getUser();
}
disconnect() {}
}
, который отлично работает, и я очень рад, что мне удалось запустить и запустить поддельный API, но когда я пытаюсь вернуть пагинатор, как это
ngOnInit() {
this.dataSource.paginator = this.paginator;
}
, я получаю эту ошибку:
TS2339: свойство 'paginator' не существует для типа 'UserDataSource'
Что имеет смысл, поскольку MatTableDataSource
есть, а я нет. У меня вопрос, как мне заставить работать пагинатор в моем случае? Прошло 3 дня и ничего не получается. Я пробовал расширить MatTableDataSource
, но это не сработало.