Как использовать paginator из материала angular?
Я новичок в угловых и пытаюсь реализовать нумерацию страниц в моем приложении. Я пытаюсь использовать этот материальный компонент.
С помощью приведенного ниже кода я могу получить length
, pagesize
и pageSizeOptions
в моем файле .ts
<md-paginator [length]="length"
[pageSize]="pageSize"
[pageSizeOptions]="pageSizeOptions"
</md-paginator>
export class PaginatorConfigurableExample {
length = 100;
pageSize = 10;
pageSizeOptions = [5, 10, 25, 100];
}
}
но я не могу вызвать функцию изменения данных в таблице выше при изменении страницы. Кроме того, как я могу использовать nextPage
, previousPage
, hasNextPage
и hasPreviousPage
?
Ответы
Ответ 1
Я борюсь с тем же здесь. Но я могу показать вам, что у меня есть некоторые исследования. По сути, вы сначала начинаете добавлять событие страницы @Output в foo.template.ts:
<md-paginator #paginator
[length]="length"
[pageIndex]="pageIndex"
[pageSize]="pageSize"
[pageSizeOptions]="[5, 10, 25, 100]"
(page)="pageEvent = getServerData($event)"
>
</md-paginator>
И позже вы должны добавить атрибут pageEvent в класс foo.component.ts и другие для обработки требований разбивки на страницы:
pageEvent: PageEvent;
datasource: null;
pageIndex:number;
pageSize:number;
length:number;
И добавьте метод, который будет извлекать данные сервера:
ngOnInit() {
getServerData(null) ...
}
public getServerData(event?:PageEvent){
this.fooService.getdata(event).subscribe(
response =>{
if(response.error) {
// handle error
} else {
this.datasource = response.data;
this.pageIndex = response.pageIndex;
this.pageSize = response.pageSize;
this.length = response.length;
}
},
error =>{
// handle error
}
);
return event;
}
Таким образом, практически каждый раз, когда вы нажимаете на страницу, вы активируете метод getServerData (..), который будет вызывать foo.service.ts для получения всех необходимых данных. В этом случае вам не нужно обрабатывать события nextPage и nextXXX, поскольку они будут автоматически рассчитываться при рендеринге представления.
Надеюсь, это поможет вам. Дайте мне знать, если у вас был успех. знак равно
Ответ 2
Эй, я наткнулся на это и получил его работать, вот как:
внутри моего component.html
<mat-paginator #paginator [pageSize]="pageSize" [pageSizeOptions]="[5, 10, 20]" [showFirstLastButtons]="true" [length]="totalSize"
[pageIndex]="currentPage" (page)="pageEvent = handlePage($event)">
</mat-paginator>
Внутри моего component.ts
public array: any;
public displayedColumns = ['', '', '', '', ''];
public dataSource: any;
public pageSize = 10;
public currentPage = 0;
public totalSize = 0;
@ViewChild(MatPaginator) paginator: MatPaginator;
constructor(private app: AppService) { }
ngOnInit() {
this.getArray();
}
public handlePage(e: any) {
this.currentPage = e.pageIndex;
this.pageSize = e.pageSize;
this.iterator();
}
private getArray() {
this.app.getDeliveries()
.subscribe((response) => {
this.dataSource = new MatTableDataSource<Element>(response);
this.dataSource.paginator = this.paginator;
this.array = response;
this.totalSize = this.array.length;
this.iterator();
});
}
private iterator() {
const end = (this.currentPage + 1) * this.pageSize;
const start = this.currentPage * this.pageSize;
const part = this.array.slice(start, end);
this.dataSource = part;
}
Вся работа по подкачке выполняется из метода iterator
. Этот метод dataSource
skip
и take
и назначает его dataSource
для таблицы Материал.
Ответ 3
Другой способ связать Angular Paginator с таблицей данных с помощью Slice Pipe. Здесь данные выбираются только один раз с сервера.
Посмотреть:
<div class="col-md-3" *ngFor="let productObj of productListData |
slice: lowValue : highValue">
//actual data dispaly
</div>
<mat-paginator [length]="productListData.length" [pageSize]="pageSize"
(page)="pageEvent = getPaginatorData($event)">
</mat-paginator>
Составная часть
pageIndex:number = 0;
pageSize:number = 50;
lowValue:number = 0;
highValue:number = 50;
getPaginatorData(event){
console.log(event);
if(event.pageIndex === this.pageIndex + 1){
this.lowValue = this.lowValue + this.pageSize;
this.highValue = this.highValue + this.pageSize;
}
else if(event.pageIndex === this.pageIndex - 1){
this.lowValue = this.lowValue - this.pageSize;
this.highValue = this.highValue - this.pageSize;
}
this.pageIndex = event.pageIndex;
}
Ответ 4
Проблема в исходном вопросе заключается в том, что вы не захватываете событие "page", для решения которого вам необходимо добавить (page)='yourEventHandler($event)
' в качестве атрибута в теге md-paginator.
проверьте рабочий пример здесь
Вы также можете проверить API документы здесь
Ответ 5
Составная часть:
import { Component, AfterViewInit, ViewChild } from @angular/core;
import { MatPaginator } from @angular/material;
export class ClassName implements AfterViewInit {
@ViewChild(MatPaginator) paginator: MatPaginator;
length = 1000;
pageSize = 10;
pageSizeOptions: number[] = [5, 10, 25, 100];
ngAfterViewInit() {
this.paginator.page.subscribe(
(event) => console.log(event)
);
}
HTML
<mat-paginator
[length]="length"
[pageSize]="pageSize"
[pageSizeOptions]="pageSizeOptions"
[showFirstLastButtons]="true">
</mat-paginator>
Ответ 6
Потратив несколько часов на это, я думаю, что это лучший способ применить нумерацию страниц. И что еще более важно это работает. Это мой код для разбивки на страницы <mat-paginator #paginatoR [length]="length" [pageSize]="pageSize" [pageSizeOptions]="pageSizeOptions">
Внутри моего компонента @ViewChild(MatPaginator) paginator: MatPaginator;
чтобы просмотреть дочерний процесс и, наконец, вы должны привязать paginator к таблице dataSource, и вот как это делается ngAfterViewInit() {this.dataSource.paginator = this.paginator;}
Легко ли? если это работает для вас, пометьте это как ответ.
Ответ 7
В большинстве случаев вы не хотите использовать событие страницы. Пока вы предоставляете таблицу данных с источником данных, который имеет методы Connect и Disconnect, paginator позаботится об "обновлении" этого источника данных, который, в свою очередь, обновит таблицу.
Обязательно стоит прочитать эту статью для разбивки на страницы на стороне сервера и т. Д.: Таблица данных угловых материалов: полный пример
Ответ 8
Эта проблема решена после нескольких часов, и я получил его на работу. Это самый простой способ решить нумерацию страниц с помощью углового материала. - Сначала запустите, работая над файлом (component.html)
<mat-paginator [pageSizeOptions]="[2, 5, 10, 15, 20]" showFirstLastButtons>
</mat-paginator>
и сделать в (component.ts) файле
import { MatPaginator } from '@angular/material/paginator';
import { Component, OnInit, ViewChild } from '@angular/core';
export interface UserData {
full_name: string;
email: string;
mob_number: string;
}
export class UserManagementComponent implements OnInit{
dataSource : MatTableDataSource<UserData>;
@ViewChild(MatPaginator) paginator: MatPaginator;
constructor(){
this.userList();
}
ngOnInit() { }
public userList() {
this._userManagementService.userListing().subscribe(
response => {
console.log(response['results']);
this.dataSource = new MatTableDataSource<UserData>(response['results']);
this.dataSource.paginator = this.paginator;
console.log(this.dataSource);
},
error => {});
}
}
Помните, необходимо импортировать модуль разбивки на страницы в вашем текущем работающем файле module (module.ts).
import {MatPaginatorModule} from '@angular/material/paginator';
@NgModule({
imports: [MatPaginatorModule]
})
Надеюсь, это сработает для вас.
Ответ 9
основываясь на ответе Уэсли Кутзи, я написал это. Надеюсь, что это может помочь любому найти этот вопрос. У меня были ошибки с заменой размера страницы в середине списка, поэтому я отправляю свой ответ:
Paginator HTML и список
<mat-paginator [length]="localNewspapers.length" pageSize="{{highValue}}"
(page)="getPaginatorData($event)" [pageSizeOptions]="[10, 20, 30]"
showFirstLastButtons="false">
</mat-paginator>
<mat-list>
<app-newspaper-pagi-item *ngFor="let paper of (localNewspapers |
slice: lowValue : highValue)"
[newspaper]="paper">
</app-newspaper-pagi-item>
Компонентная логика
import {Component, Input, OnInit} from "@angular/core";
import {PageEvent} from "@angular/material";
@Component({
selector: 'app-uniques-newspaper-list',
templateUrl: './newspaper-uniques-list.component.html',
})
export class NewspaperUniquesListComponent implements OnInit {
lowValue: number = 0;
highValue: number = 20;
{...} // not relevant logic
// used to build an array of papers relevant at any given time
public getPaginatorData(event: PageEvent): PageEvent {
this.lowValue = event.pageIndex * event.pageSize;
this.highValue = this.lowValue + event.pageSize;
return event;
}
}